首页 > 解决方案 > 调整大小时如何使 QTreeWidget 调用 sizeHint?

问题描述

我正在使用自定义QStyledItemDelegate以在QTreeWidget. 因此,我已经实现了paint()sizeHint()功能。

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

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

我尝试在树小部件上显式设置uniformHeightstofalsewordWrapto 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函数以更频繁地调用(在所有调整大小事件上)?

标签: qtdelegatesqt5qtreewidget

解决方案


这个答案的部分灵感来自scopchanov的评论- 谢谢!

为了让树小部件更新其布局,我必须首先创建子类QTreeWidget,然后覆盖QTreeWidget::resizeEvent。这样我得到了一个钩子,每次调整小部件的大小时,我都可以在其中注入代码。

为了让小部件实际更新其布局,我使用QAbstractItemView::scheduleDelayedItemsLayout(QAbstracTItemView::executeDelayedItemsLayout应该也可以)。

因此,总而言之,我的resizeEvent功能如下所示:

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

    QTreeWidget::resizeEvent(event);
}

参考:


推荐阅读