Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调整大小时如何使QTreeWidget调用sizeHint?_Qt_Delegates_Qt5_Qtreewidget - Fatal编程技术网

调整大小时如何使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
)只会导致重新绘制,而不会重新计算项目的大小。因此,基本上我说的是对的,在你的问题结束时,你有解决方案的关键,即在所有调整大小事件上。;)很高兴它成功了@斯科普切诺夫:是的。再次感谢!:)