2016-07-25 5 views
0

Ich habe eine QTreeView mit mehr als einer Spalte (wie eine Tabelle). Spalten im Baum haben eine feste Größe. Ich muss die Zeilenhöhe ändern und mehrzeiligen Text wie QTableView::resizeRowsToContents verwenden. Wie kann ich das tun?QTreeView: resizeRowsToContents gleichwertig oder wie man Text in Zeilen einpackt

Ich habe versucht, eine benutzerdefinierte QStyledItemDelegate mit Reimplementiert sizeHint, aber ich weiß nicht, wie mehrzeilige Textblockhöhe mit bekannter Breite zu berechnen.

Antwort

1

Mit QStyledItemDelegate ist der richtige Ansatz. In Ihrer sizehinz-Funktion können Sie den Stil Optionen text mit der QFontMetrics Klasse verwenden:

QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override { 
    QSize baseSize = this->QStyledItemDelegate::sizeHint(option, index); 
    baseSize.setHeight(10000);//something very high, or the maximum height of your text block 

    QFontMetrics metrics(option.font); 
    QRect outRect = metrics.boundingRect(QRect(QPoint(0, 0), baseSize), Qt::AlignLeft, option.text); 
    baseSize.setHeight(outRect.height()); 
    return baseSize; 
} 

Hinweis: Im Moment habe ich das nicht testen können, aber es sollte funktionieren. Sie können den Anruf zu metrics.boundingRect optimieren, wenn die Ausgabe nicht Ihre Bedürfnisse paßt

EDIT:
Es scheint, die sizeHint wird nur einmal das anfängliche Layout erstellen aufgerufen werden, nicht aber nach den Spalten Ändern der Größe.

Eine letzte Idee könnte sein, die QAbstractItemModel::data Funktion zu überschreiben, um die gewünschte Größe unter Verwendung Qt::SizeHintRole zurückzugeben. Sie könnten entweder es zu einem vorhandenen Modell hinzufügen oder ein Proxy-Modell, dies zu tun bieten:

QSize MyModel::data(const QModelIndex &index, int role) const override { 
    switch(role) { 
     //... 
    case Qt::SizeHintRole: 
    { 
     QSize baseSize(getFixedWidth(index.column()), baseSize.setHeight(10000));//something very high, or the maximum height of your text block 

     QFontMetrics metrics(this->data(index, Qt::FontRole).value<QFont>()); 
     QRect outRect = metrics.boundingRect(QRect(QPoint(0, 0), baseSize), Qt::AlignLeft, this->data(index, Qt::DisplayRole))); 
     baseSize.setHeight(outRect.height()); 
     return baseSize; 
    } 
     //... 
    } 
} 

Wichtig: Jedes Ihrer Ansicht nach der Größe verändert wird, werden Sie das dataChanged Signal für alle jene Elemente emittieren müssen. getFixedWidth müssen Sie implementieren, um die aktuelle Breite der angegebenen Spalte zurückzugeben.

+0

OK, es funktioniert! Aber wie lässt sich die Größe von Zellen bei einer Größenänderung wieder verändern? – Rinat

+0

Ich bin nicht sicher, was du meinst? Ändern der Größe eines Header-Abschnitts? – Felix

+0

Ja, die Größe der Zeilen wurde beim Laden einmal geändert. Bei der Größenänderung des Headerabschnitts und der Spaltenbreite wurde jedoch nichts geändert. – Rinat