我有一個帶有多個列(如表格)的QTreeView
。樹中的列具有固定的大小。我需要調整行高,並使用多行文本,如QTableView::resizeRowsToContents
。 我該怎麼做?QTreeView:resizeRowsToContents等價物或如何在文本行中進行文字換行
我試過使用自定義QStyledItemDelegate
與重新實現sizeHint
,但我不知道如何計算已知寬度的多行文本塊高度。
我有一個帶有多個列(如表格)的QTreeView
。樹中的列具有固定的大小。我需要調整行高,並使用多行文本,如QTableView::resizeRowsToContents
。 我該怎麼做?QTreeView:resizeRowsToContents等價物或如何在文本行中進行文字換行
我試過使用自定義QStyledItemDelegate
與重新實現sizeHint
,但我不知道如何計算已知寬度的多行文本塊高度。
使用QStyledItemDelegate
是正確的方法。在你sizehinz功能,您可以使用樣式選項text與QFontMetrics類:
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;
}
注:現在我不能對此進行測試,但它應該工作。您可能需要調整調用metrics.boundingRect
如果輸出不適合您的需求
編輯:
看來sizeHint
將只調用一次以創建初始佈局,但不調整列後。
最後的想法可能是覆蓋QAbstractItemModel::data
函數以使用Qt::SizeHintRole
返回所需的大小。你既可以把它添加到您現有的模型或提供代理模型要做到這一點:
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;
}
//...
}
}
重要提示:每當你視圖獲取大小,你將不得不發出dataChanged
信號對所有這些項目。 getFixedWidth
是你必須實現的東西,以返回給定列的當前寬度。
好的,它的工作原理!但是如何讓細胞再次調整大小? – Rinat
我不確定你的意思?調整標題部分的大小? – Felix
是的,行在加載時調整大小,但在更改標題部分和列寬度時更改大小 – Rinat