调整大小时如何使QTreeWidget调用sizeHint?
How to make QTreeWidget call sizeHint when resized?
我正在使用自定义 QStyledItemDelegate
以便在 QTreeWidget
中显示数据。因此我实现了 paint()
和 sizeHint()
函数。
绘画效果很好,但 sizeHint
有一些问题。问题是,如果水平 space 不足以在不换行的情况下显示,我正在显示一些将换行的文本。问题是当 QTreeWidget
调整大小时,Qt 似乎没有调用 sizeHint
函数。在这些情况下只会调用 paint
函数,但是当我的项目改变它们的行高(取决于它们是否换行以及换行的频率)时,这会导致树的布局变得混乱。
目前的情况是:布局在小部件创建后立即按预期工作,只要不调整大小,一切都很好。然而,如果要调整小部件的大小,文本开始或停止换行,更改项目的高度(这都是在 paint
函数中完成的,该函数仍会定期调用),然后树的垂直布局被破坏(这些项目要么 space 距离很远,要么开始重叠,具体取决于项目现在是用更少还是更多的垂直 space 来渲染)。
我曾尝试在树形小部件上将 uniformHeights
显式设置为 false
并将 wordWrap
显式设置为 true
,但这似乎没有任何效果。
这是一个示例性的 sizeHint
函数:
QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem &inOption, const QModelIndex &index) {
QStyleOptionView option = inOption;
initStyleOption(option);
QTextDocumentOptioon opt;
opt.setWrapMode(Qt::WrapAtWordBoundaryOrAnywhere);
opt.setAlignment(Qt::AlignLeft)
QTextDocument doc;
doc.setDefaultTextOption(opt);
doc.setTextWidth(option.widget->size().width());
doc.setHtml("An example text that may or may not wrap");
return doc.size();
}
如何让树小部件调用项目委托的 sizeHint
函数以更频繁地调用(在所有调整大小事件中)?
这个答案的部分灵感来自 scopchanov 的评论 - 谢谢!
为了让树形小部件更新其布局,我必须首先子类化 QTreeWidget
,然后覆盖 QTreeWidget::resizeEvent
。这样我就得到了一个钩子,每次调整小部件的大小时我都可以在其中注入代码。
为了让小部件实际更新其布局,我使用 QAbstractItemView::scheduleDelayedItemsLayout
(QAbstracTItemView::executeDelayedItemsLayout
也应该有效)。
因此,总而言之,我的 resizeEvent
函数如下所示:
void MyCustomTree::resizeEvent(QResizeEvent *event) {
scheduleDelayedItemsLayout();
QTreeWidget::resizeEvent(event);
}
参考文献:
我正在使用自定义 QStyledItemDelegate
以便在 QTreeWidget
中显示数据。因此我实现了 paint()
和 sizeHint()
函数。
绘画效果很好,但 sizeHint
有一些问题。问题是,如果水平 space 不足以在不换行的情况下显示,我正在显示一些将换行的文本。问题是当 QTreeWidget
调整大小时,Qt 似乎没有调用 sizeHint
函数。在这些情况下只会调用 paint
函数,但是当我的项目改变它们的行高(取决于它们是否换行以及换行的频率)时,这会导致树的布局变得混乱。
目前的情况是:布局在小部件创建后立即按预期工作,只要不调整大小,一切都很好。然而,如果要调整小部件的大小,文本开始或停止换行,更改项目的高度(这都是在 paint
函数中完成的,该函数仍会定期调用),然后树的垂直布局被破坏(这些项目要么 space 距离很远,要么开始重叠,具体取决于项目现在是用更少还是更多的垂直 space 来渲染)。
我曾尝试在树形小部件上将 uniformHeights
显式设置为 false
并将 wordWrap
显式设置为 true
,但这似乎没有任何效果。
这是一个示例性的 sizeHint
函数:
QSize MyItemDelegate::sizeHint(const QStyleOptionViewItem &inOption, const QModelIndex &index) {
QStyleOptionView option = inOption;
initStyleOption(option);
QTextDocumentOptioon opt;
opt.setWrapMode(Qt::WrapAtWordBoundaryOrAnywhere);
opt.setAlignment(Qt::AlignLeft)
QTextDocument doc;
doc.setDefaultTextOption(opt);
doc.setTextWidth(option.widget->size().width());
doc.setHtml("An example text that may or may not wrap");
return doc.size();
}
如何让树小部件调用项目委托的 sizeHint
函数以更频繁地调用(在所有调整大小事件中)?
这个答案的部分灵感来自 scopchanov 的评论 - 谢谢!
为了让树形小部件更新其布局,我必须首先子类化 QTreeWidget
,然后覆盖 QTreeWidget::resizeEvent
。这样我就得到了一个钩子,每次调整小部件的大小时我都可以在其中注入代码。
为了让小部件实际更新其布局,我使用 QAbstractItemView::scheduleDelayedItemsLayout
(QAbstracTItemView::executeDelayedItemsLayout
也应该有效)。
因此,总而言之,我的 resizeEvent
函数如下所示:
void MyCustomTree::resizeEvent(QResizeEvent *event) {
scheduleDelayedItemsLayout();
QTreeWidget::resizeEvent(event);
}
参考文献: