QT QListView的项长文本无法完全显示问题

背景

使用的是QT的Model/View框架

QListView

class TestLogModel : public QAbstractListModel

class TestLogItemDelegate : public QStyledItemDelegate

现象

项中的长文本无法完整显示,而且QListView的水平滚动条没有出现,如下图所示

原因分析&解决方案

首先,需要明确的是,QListView的水平滚动条是否出现取决于列表宽度的大小,而在Model/View框架下,QListView的宽度取决于项的文本长度,也就是项编辑器委托的displayText()

因为我们这里使用了自定义委托,所以需要重写继承自QStyledItemDelegate的虚函数

virtual QString displayText(const QVariant& value, const QLocale& locale) const;

QString TestLogItemDelegate::displayText(const QVariant& value, const QLocale& locale) const
{
	Q_UNUSED(locale)
	LogItem logItem = value.value<LogItem>();
	return logItem.text(); 
	
}

修改后效果

 出现这个问题的原因是我这里重写了虚函数paint(),重绘了项的外观,改变了字体大小、字体颜色、字体家族等属性,字符串的长度相对地增加了,比displayText()返回的文本长度更长了

void TestLogItemDelegate::paint(QPainter* painter, 
								const QStyleOptionViewItem& option, 
								const QModelIndex& index) const
{
	if (index.isValid()
		&& index.data().canConvert<LogItem>())
	{
		LogItem logItem = index.data().value<LogItem>();
		LogItem::LogType logType = logItem.type();
		QBrush brush;
		QPen pen;

		switch (logType)
		{
		case LogItem::LOG_SUCCESS:
			brush.setColor(Qt::green);
			pen.setColor(Qt::black);
			break;
		case LogItem::LOG_WARNING:
			brush.setColor(Qt::yellow);
			pen.setColor(Qt::black);
			break;
		case LogItem::LOG_ERROR:
			brush.setColor(Qt::red);
			pen.setColor(Qt::black);
			break;
		case LogItem::LOG_NOTES:
			brush.setColor(Qt::gray);
			pen.setColor(Qt::yellow);
			break;
		case LogItem::LOG_TITLE:
			brush.setColor(Qt::transparent);
			pen.setColor(Qt::blue);
			break;
		case LogItem::LOG_RESET:
			brush.setColor(Qt::transparent);
			pen.setColor(Qt::yellow);
			break;
		case LogItem::LOG_NORMAL:
		default:
			brush.setColor(Qt::transparent);
			pen.setColor(Qt::black);
			break;
		}

		painter->setPen(Qt::NoPen);
		brush.setStyle(Qt::SolidPattern);
		painter->setBrush(brush);
		QRect itemRect = option.rect;
		painter->drawRect(itemRect);

		painter->setFont(*m_font);
		painter->setPen(pen);
		painter->drawText(option.rect.bottomLeft() - QPoint(-2,2), logItem.text());
		return;
	}

	QStyledItemDelegate::paint(painter, option, index);
}

如果禁用paint()函数,长文本就能完全显示出来了

void TestLogItemDelegate::paint(QPainter* painter, 
								const QStyleOptionViewItem& option, 
								const QModelIndex& index) const
{
	QStyledItemDelegate::paint(painter, option, index);
}

虽然水平滚动条出现了,而且长文本也能完整显示了,但是这并不是我期望的,因为这样失去了我所期望的外观,所以我采取的方法是曲线救国,paint()函数不做变动,而在displayText()做修改,增长displayText()的返回字符串的长度

QString TestLogItemDelegate::displayText(const QVariant& value, const QLocale& locale) const
{
	Q_UNUSED(locale)
	LogItem logItem = value.value<LogItem>();
	QString text(logItem.text());
	text += QString("%1").arg(0, logItem.text().length()*0.6, 10, QLatin1Char('0'));
	return text; 
}

 这里使用0做补充,多增加了原来文本长度的60%的长度,虽然这样不能做到完美,多出了较长的空白段,但是达到了既能完整显示长文本,又能保留外观的效果。

对于这个问题,如果大家有更好的解决方案,欢迎评论区留言~

转载请注明出处~~

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值