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

时间:2013-07-29 13:37:31

标签: c++ qt qt4

我有一个列表视图。该列表视图包含项目。对于每个项目,我使用setItemDelegate,并重写委托的paint方法。我认为在每个项目中我都会写一些文本,而当文本很长时,就没有足够的空间了。

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

提前致谢,

2 个答案:

答案 0 :(得分:2)

你做不到。当调用项委托的paint方法时,列表视图已经布局,并且您作为参数接收的QPainter可能具有与大小提示大小相同的绘图表面,或者至少具有变换和裁剪rect设置为尊重大小提示。

您必须使用QAbstractItemDelegate::sizeHint方法计算文本大小(使用QFontMetrics)并返回适当的大小提示。 Cache your results以获得更好的效果。

答案 1 :(得分: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)
}