首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制QAbstractItemView重新计算项目sizeHints

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

Stack Overflow用户
提问于 2013-05-08 23:28:37
回答 4查看 2.6K关注 0票数 7

我在QSplitter中有QListView和QTabWidget。QListView正在使用自定义模型和自定义委托。在委托中,我重新实现了paint和sizeHint方法。但是当我调整视图大小时,元素的高度不会重新计算。我怎么才能修复它?示例图像:

在谷歌我发现,这是可能的emit layoutChanged从模型,但我只想要更新当前的视图,因为模型的内容不会改变。

委托代码:

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-14 02:52:00

在深入研究Qt源代码后,我发现scheduleDelayedItemsLayout()函数正在解决我这边的问题。

票数 4
EN

Stack Overflow用户

发布于 2017-11-06 07:29:21

在2017年11月经历了同样的问题...

我发现解决它的唯一方法是这个丑陋的黑客:

代码语言:javascript
复制
   QSize size = listView->viewport()->size();
   size.setHeight(size.height()+1);
   listView->viewport()->resize(size);

   size.setHeight(size.height()-1);
   listView->viewport()->resize(size);

它强制在listview上调整大小,而listview本身也会刷新它的行大小。

票数 2
EN

Stack Overflow用户

发布于 2013-05-08 23:44:10

这只是一个猜测,但是设置QListView的调整大小模式有帮助吗?

代码语言:javascript
复制
listView->setResizeMode( QListView::Adjust );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16444558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档