8

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

调整大小之前调整大小后

在谷歌中,我发现可以从模型中发出 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();
}

类似的问题

4

4 回答 4

4

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

于 2018-02-13T18:52:00.180 回答
2

在 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);

它强制调整列表视图的大小,它本身会刷新其行大小。

于 2017-11-05T23:29:21.140 回答
1

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

listView->setResizeMode( QListView::Adjust );
于 2013-05-08T15:44:10.307 回答
0

没有其他解决方案对我有用,但这确实:

listView->setViewMode(QListView::IconMode);
listView->setViewMode(QListView::ListMode);
于 2021-12-16T10:30:07.230 回答