我有一个带有多个列(如表格)的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