2013-05-08 12 views
5

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

Before resizingAfter resizing

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

Similar question

risposta

1

Questo è un po 'di una supposizione, ma non impostare il vostro aiuto la modalità di ridimensionamento di QListView?

listView->setResizeMode(QListView::Adjust); 
+0

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. –

+0

view-> model() -> reset() è mega-slow :( –

+0

che ne dici di chiamare QAbstractItemView :: updateGeometries()? – Chris

1

riscontrato lo stesso problema nel novembre 2017 ...

L'unico modo che ho trovato per risolvere è questo brutto hack:

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

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

Costringe un ridimensionamento sul ListView, che Aggiorna automaticamente le sue dimensioni di riga.

Problemi correlati