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.
OK, es funktioniert! Aber wie lässt sich die Größe von Zellen bei einer Größenänderung wieder verändern? – Rinat
Ich bin nicht sicher, was du meinst? Ändern der Größe eines Header-Abschnitts? – Felix
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