调整大小时如何使QTreeWidget调用sizeHint?
我正在使用自定义的调整大小时如何使QTreeWidget调用sizeHint?,qt,delegates,qt5,qtreewidget,Qt,Delegates,Qt5,Qtreewidget,我正在使用自定义的QStyledItemDelegate,以便在QTreeWidget中显示数据。因此,我实现了paint()和sizeHint()函数 这幅画很好,但我对sizeHint有一些问题。问题是,如果水平空间不足以显示而不进行换行,我将显示一些将换行的文本。问题是当调整QTreeWidget的大小时,Qt似乎没有调用sizeHint函数。在这些情况下,仅调用paint函数,但当“我的项目”更改其行高(取决于它们是否换行以及换行的频率)时,这会导致树的布局混乱 目前的情况是:在小部件创
QStyledItemDelegate
,以便在QTreeWidget
中显示数据。因此,我实现了paint()
和sizeHint()
函数
这幅画很好,但我对sizeHint
有一些问题。问题是,如果水平空间不足以显示而不进行换行,我将显示一些将换行的文本。问题是当调整QTreeWidget
的大小时,Qt似乎没有调用sizeHint
函数。在这些情况下,仅调用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();
}
如何让tree小部件调用item delegate的
sizeHint
函数以更频繁地调用(在所有调整大小事件中)?这个答案的部分灵感来自于来自的评论-谢谢
为了让树小部件更新其布局,我必须首先使用子类QTreeWidget
,然后覆盖QTreeWidget::resizeEvent
。这样我就得到了一个钩子,每次调整小部件的大小时,我都可以将代码插入其中
为了让小部件实际更新其布局,我使用了qabstratemView::scheduleDelayedItemsLayout
(qabstratemView::executeDelayedItemsLayout
也应该可以工作)
因此,总的来说,我的resizeEvent
函数如下所示:
void MyCustomTree::resizeEvent(QResizeEvent *event) {
scheduleDelayedItemsLayout();
QTreeWidget::resizeEvent(event);
}
参考文献:
ResizeEvent
并手动调用repaint
。@scopchanov是否repaint
也重新计算布局?从名称上看,它似乎只会重新绘制现有的按钮…知道这一点的一种方法是尝试。我刚刚测试了这一点,它似乎与我一样帮助:repait
(和update
)只会导致重新绘制,而不会重新计算项目的大小。因此,基本上我说的是对的,在你的问题结束时,你有解决方案的关键,即在所有调整大小事件上。;)很高兴它成功了@斯科普切诺夫:是的。再次感谢!:)