Ho QListView e QTabWidget all'interno di QSplitter. QListView utilizza modelli personalizzati e delegati personalizzati. In delegato ho reimplementato i metodi paint e sizeHint. Ma quando ridimensiono la vista, l'altezza degli elementi non viene ricalcolata. Come posso ripararlo? immagini di esempio:Come forzare QAbstractItemView ricalcolare gli elementi sizeHints
in google ho trovato che è possibile emit layoutChanged dal modello, ma voglio solo vista corrente da aggiornare, perché il contenuto del modello non cambia.
codice Delegato:
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();
}
Non aiutato. Attualmente sono connesso al segnale splitterMoved di QSplitter e visualizza la vista-> model() -> reset() su ciascun dimensionamento. Non penso che sia buono, proverò a testarlo per un sacco di oggetti ora. –
view-> model() -> reset() è mega-slow :( –
che ne dici di chiamare QAbstractItemView :: updateGeometries()? – Chris