我使用自定义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函数(对于所有调整大小的事件)?
发布于 2021-04-12 16:01:38
这个答案的部分灵感来自于scopchanov的评论--谢谢!
为了让树小部件更新其布局,我首先必须使用子类QTreeWidget,然后重写QTreeWidget::resizeEvent。这样,每次小部件被调整大小时,我就可以插入代码。
为了让小部件真正更新其布局,我使用了QAbstractItemView::scheduleDelayedItemsLayout (QAbstracTItemView::executeDelayedItemsLayout也应该工作)。
因此,总的来说,我的resizeEvent函数如下所示:
void MyCustomTree::resizeEvent(QResizeEvent *event) {
scheduleDelayedItemsLayout();
QTreeWidget::resizeEvent(event);
}参考文献:
https://stackoverflow.com/questions/67009861
复制相似问题