微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调整大小时如何让 QTreeWidget 调用 sizeHint?

如何解决调整大小时如何让 QTreeWidget 调用 sizeHint?

我使用自定义 qstyledItemDelegate 以在 QTreeWidget显示数据。因此,我实现了 paint()sizeHint() 函数

这幅画效果很好,但我对 sizeHint 有一些问题。问题是,如果水平空间不足以在不换行的情况下显示,我将显示一些将换行的文本。问题是当调整 sizeHint 的大小时,Qt 似乎没有调用 QTreeWidget 函数在这些情况下,只有 paint 函数调用,但随着我的项目改变它们的行高(取决于它们是否换行以及换行的频率),这会导致树的布局变得混乱。

目前的情况是:布局在小部件创建后立即按预期工作,只要不调整大小,一切都像魅力一样。然而,如果要调整小部件的大小,文本开始或停止换行,改变项目的高度(这一切都在 paint 函数中完成,该函数仍会定期调用),然后树的垂直布局被破坏(项目要么间隔很远,要么开始重叠,具体取决于项目现在占用的垂直空间是更少还是更多)。

我已经尝试在树小部件上将 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::scheduleDelayedItemsLayoutQAbstracTItemView::executeDelayedItemsLayout 应该也可以)。

因此,我的所有 resizeEvent 函数如下所示:

void MyCustomTree::resizeEvent(QResizeEvent *event) {
    scheduleDelayedItemsLayout();

    QTreeWidget::resizeEvent(event);
}

参考:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。