如何强制 QAbstractItemView 重新计算项目 sizeHints [英] How to force QAbstractItemView recalculate items sizeHints

查看:26
本文介绍了如何强制 QAbstractItemView 重新计算项目 sizeHints的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have QListView and QTabWidget inside QSplitter. QListView is using custom model and custom delegates. In delegate I reimplemented paint and sizeHint methods. But when I resize view - height of elements doesn't recalculated. How can I fix it? Sample images:

在谷歌我发现可以 从模型中发出 layoutChanged,但我只想更新当前视图,因为模型的内容不会改变.

In google I found that it is possible to emit layoutChanged from the model, but I want only current view to be updated, because content of model doesn't change.

委托代码:

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

类似问题

推荐答案

在Qt源代码中挖掘后,我发现scheduleDelayedItemsLayout() 函数正在解决我这边的问题.

After digging in Qt source code, I found that scheduleDelayedItemsLayout() function is solving the issue on my side.

这篇关于如何强制 QAbstractItemView 重新计算项目 sizeHints的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆