首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使QTreeWidget在调整大小时调用sizeHint?

如何使QTreeWidget在调整大小时调用sizeHint?
EN

Stack Overflow用户
提问于 2021-04-08 18:28:37
回答 1查看 235关注 0票数 1

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

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

目前的情况是:在小部件创建之后,布局就像预期的那样工作,只要不调整大小,一切都像魅力一样工作。但是,如果要调整小部件的大小,文本将开始或停止包装,更改项的高度(这都是在paint函数中完成的,该函数仍然定期调用),然后树的垂直布局被破坏(这些项要么以巨大的距离间隔,要么它们开始重叠,这取决于项目现在是否占用较少或更多的垂直空间来呈现)。

我已经尝试在树小部件上显式地将uniformHeights设置为false,将wordWrap设置为true,但这似乎没有任何效果。

这是一个示例性的sizeHint函数:

代码语言:javascript
复制
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函数(对于所有调整大小的事件)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-12 16:01:38

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

为了让树小部件更新其布局,我首先必须使用子类QTreeWidget,然后重写QTreeWidget::resizeEvent。这样,每次小部件被调整大小时,我就可以插入代码。

为了让小部件真正更新其布局,我使用了QAbstractItemView::scheduleDelayedItemsLayout (QAbstracTItemView::executeDelayedItemsLayout也应该工作)。

因此,总的来说,我的resizeEvent函数如下所示:

代码语言:javascript
复制
void MyCustomTree::resizeEvent(QResizeEvent *event) {
    scheduleDelayedItemsLayout();

    QTreeWidget::resizeEvent(event);
}

参考文献:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67009861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档