Cómo forzar QAbstractItemView recalcular elementos sizeHints
Tengo QListView y QTabWidget dentro de QSplitter. QListView utiliza un modelo personalizado y delegados personalizados. En delegado reimplementé los métodos de pintura y tamaño. Pero cuando cambio el tamaño de la vista, la altura de los elementos no se recalcula. ¿Cómo puedo arreglarlo? Imágenes de muestra:
En google encontré que es posibleemitir diseñoCambiado del modelo, pero quiero que solo se actualice la vista actual, porque el contenido del modelo no cambia.
Código del delegado:
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();
}