使用Qt中的委托更改列表项大小

Varying list item size using delegate in Qt

本文关键字:列表 Qt 使用      更新时间:2023-10-16

我有一个列表视图。该列表视图包含项目。对于每个项目,我使用setItemDelegate,并覆盖该委托的绘制方法。我的想法是,在每一项中,我都在写一些文本,当文本很长时,没有足够的空间。

如何从绘制事件调整项目大小?因为我在绘制事件中获得了绘制文本的边界框。

提前感谢,

您不能。当调用项目代理的paint方法时,列表视图已经布局,并且作为参数接收的QPainter可能具有与大小提示大小相同的绘图曲面,或者至少设置了一个与大小提示相关的变换和剪裁矩形。

必须使用QAbstractItemDelegate::sizeHint方法(使用QFontMetrics)计算文本大小,并返回适当的大小提示。缓存您的结果以获得更好的性能。

您需要实现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)
}