背景
使用的是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%的长度,虽然这样不能做到完美,多出了较长的空白段,但是达到了既能完整显示长文本,又能保留外观的效果。
对于这个问题,如果大家有更好的解决方案,欢迎评论区留言~
转载请注明出处~~