2013-05-08 10 views
5

Ich habe QListView und QTabWidget in QSplitter. QListView verwendet benutzerdefiniertes Modell und benutzerdefinierte Delegaten. In delegate habe ich die Methoden paint und sizeHint neu implementiert. Aber wenn ich die Größe verändere, wird die Höhe der Elemente nicht neu berechnet. Wie kann ich es reparieren? Beispielbilder:Erzwingen QAbstractItemView Neuberechnung von Elementen sizeHints

Before resizingAfter resizing

In google fand ich, dass es zu emit layoutChanged aus dem Modell möglich ist, aber ich mag nur aktuelle Ansicht aktualisiert werden, weil Inhalt des Modells ändert sich nicht.

Delegierter 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

Antwort

1

Das ist ein bisschen eine Vermutung ist, aber Ihre QListView des Resize-Modus Hilfe nicht einstellen?

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

Hilft nicht. Zur Zeit habe ich mich mit dem splitterMoved-Signal von QSplitter verbunden und auf jedem Sizing view-> model() -> reset() aufgerufen. Ich denke nicht, dass es gut ist, ich werde es jetzt für viele Dinge testen. –

+0

view-> model() -> reset() ist mega-langsam :( –

+0

Wie wäre es mit QAbstractItemView :: updateGeometries()? – Chris

1

das gleiche Problem erleben im November 2017 ...

Die einzige Art, wie ich es zu lösen gefunden ist dieses hässliche Hack:

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

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

Es zwingt einen Resize auf Listenansicht, die selbst aktualisiert seine Zeilengrößen.