qt - 调整大小时如何使 QTreeWidget 调用 sizeHint?
问题描述
我正在使用自定义QStyledItemDelegate
以在QTreeWidget
. 因此,我已经实现了paint()
和sizeHint()
功能。
这幅画效果很好,但我对sizeHint
. 问题是,如果水平空间不足以显示不换行,我将显示一些将换行的文本。问题是 Qt 在调整大小时似乎没有调用该sizeHint
函数QTreeWidget
。在这些情况下,只有paint
函数被调用,但是随着我的项目改变它们的行高(取决于它们是否以及它们换行的频率),这会导致树的布局变得混乱。
目前的情况是:布局在小部件创建后立即按预期工作,只要不调整大小,一切都像魅力一样工作。但是,如果要调整小部件的大小,则文本开始或停止换行,更改项目的高度(这一切都在paint
仍然定期调用的函数中完成),然后树的垂直布局被破坏(项目被隔开距离很远或者它们开始重叠,这取决于项目现在是占用更少还是更多的垂直空间来渲染)。
我尝试在树小部件上显式设置uniformHeights
tofalse
和wordWrap
to 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);
}
参考:
推荐阅读
- angular - 在 Angular 9 中使用 ngx translate 转换数组
- java - 将数据添加到列表时遇到问题
- asp.net - 不执行 Ajax 函数
- unix - 在没有密码的情况下从 Python 在远程主机上运行 Unix 命令
- kotlin-coroutines - Kotlin协程协同取消解释
- bash - unix删除重复的行块,先保留
- pandas - python 2.7 中 exec 的良好替代品
- scala - 为什么不在Scala中的对象上调用类参数?
- javascript - 根据两个数组的差异排序
- node.js - fastify session 抛出了一些我不理解的东西