使用Qt中的代理来改变列表项大小

3
我有一个列表视图,该列表视图有项目。对于每个项目,我使用setItemDelegate并覆盖委托的paint方法。问题是,在每个项目中,我写了一些文本,当文本非常长时,没有足够的空间。
在paint事件中如何调整项目的大小?因为我可以从paint事件中获取绘制文本的边界框。
提前感谢。
2个回答

2
你不能这样做。当调用项代理的paint方法时,列表视图已经被布局,并且你作为参数接收到的QPainter可能具有与大小提示相同的绘图表面,或者至少具有变换和裁剪矩形以尊重大小提示。
你必须在QAbstractItemDelegate::sizeHint方法中计算文本大小(使用QFontMetrics),并返回适当的大小提示。为了更好的性能,请缓存你的结果

嗨andref,感谢您的回答。正如您所说,我在您发布帖子之前就尝试过这个方法,并意识到我必须使用options.fontMetrics、boundingText等等来完成它...但性能不好,列表视图项加载非常缓慢(仅在开始时)。 - Didac Perez Parera
在显示项目之前,您可能希望尝试在后台线程中预先计算大小提示。同时,在GUI线程中显示一个throbber。 - andref

0

你需要实现sizeHint方法

QListItemDelegat::QListItemDelegat(): QStyledItemDelegate(0){}
QSize

QListItemDelegat::sizeHint( const QStyleOptionViewItem& option, const DataClass& data ) const
{
   const QStyle* style( QApplication::style( ) );
   QFont nameFont( option.font );

   nameFont.setWeight( QFont::Bold );
   const QFontMetrics nameFM( nameFont );
   const QString nameStr( data.GetName() );
   int nameWidth = nameFM.width(nameStr);
   int nameHeight = nameFM.height(nameStr);
   return QSize(nameWidth ,nameHeight)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接