gpt4 book ai didi

qt - 如何强制 QAbstractItemView 重新计算项目 sizeHints

转载 作者:行者123 更新时间:2023-12-04 11:54:21 39 4
gpt4 key购买 nike

我在 QSplitter 中有 QListView 和 QTabWidget。 QListView 正在使用自定义模型和自定义委托(delegate)。在委托(delegate)中,我重新实现了 paint 和 sizeHint 方法。但是当我调整 View 大小时 - 元素的高度不会重新计算。我该如何解决?
示例图像:

Before resizing After resizing

在谷歌中,我发现可以从模型中获取 emit layoutChanged,但我只想更新当前 View ,因为模型的内容不会改变。

委托(delegate)代码:

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();
}

Similar question

最佳答案

挖了Qt源码后发现scheduleDelayedItemsLayout()功能正在解决我这边的问题。

关于qt - 如何强制 QAbstractItemView 重新计算项目 sizeHints,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16444558/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com