How to force QAbstractItemView recalculate items sizeHints

a 夏天 提交于 2019-11-26 22:03:16

问题


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:

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.

Delegate code:

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


回答1:


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




回答2:


Experiencing the same issue in November 2017...

The only way I found to resolve it is this ugly hack :

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

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

It forces a resize on the listview, which itself refreshes its row sizes.




回答3:


This is a bit of a guess, but does setting your QListView's resize mode help?

listView->setResizeMode( QListView::Adjust );


来源:https://stackoverflow.com/questions/16444558/how-to-force-qabstractitemview-recalculate-items-sizehints

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!