我在QSplitter中有QListView和QTabWidget。 QListView使用自定义模型和自定义委托。在委托中,我重新实现了paint和sizeHint方法。但是当我调整视图大小时 - 元素的高度不会重新计算。我该如何解决? 示例图片:
在google中我发现模型中有emit layoutChanged可能,但我只想更新当前视图,因为模型内容不会改变。
委托代码:
void ChatItemDelegate::paint( QPainter *painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
painter->save();
ChatItem *item = static_cast< ChatItem * >( index.internalPointer() );
QTextDocument doc;
doc.setHtml( item->htmlText() );
doc.setTextWidth( option.rect.width() );
QRect clip( 0, 0, option.rect.width(), option.rect.height() );
painter->translate( option.rect.topLeft() );
QColor bgColor = index.row() % 2 ? QColor( 255, 0, 0, 40 ) : QColor( 0, 255, 0, 40 );
painter->fillRect( clip, bgColor );
doc.drawContents( painter, clip );
qDebug() << "paint: " << option.rect.width() << " idx: " << index.row();
painter->restore();
}
QSize ChatItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
ChatItem *item = static_cast< ChatItem * >( index.internalPointer() );
QTextDocument doc;
doc.setHtml( item->htmlText() );
doc.setTextWidth( option.rect.width() );
qDebug() << "hint: " << option.rect.width() << " idx: " << index.row();
return doc.size().toSize();
}
答案 0 :(得分:2)
在深入研究Qt源代码后,我发现scheduleDelayedItemsLayout()函数正在解决我这方面的问题。
答案 1 :(得分:1)
这是一个猜测,但设置QListView的调整大小模式有帮助吗?
listView->setResizeMode( QListView::Adjust );
答案 2 :(得分:1)
2017年11月遇到同样的问题......
我找到解决问题的唯一方法就是这个丑陋的黑客:
QSize size = listView->viewport()->size();
size.setHeight(size.height()+1);
listView->viewport()->resize(size);
size.setHeight(size.height()-1);
listView->viewport()->resize(size);
它强制在listview上调整大小,它本身会刷新行大小。