gpt4 book ai didi

python - Qt FlowLayout 示例 - 如何在布局更改时调用 sizeHint?

转载 作者:行者123 更新时间:2023-12-01 07:58:43 27 4
gpt4 key购买 nike

我想在布局中排列一堆 QPushButton,以便它们水平换行(如文本)。我正在尝试在 PySide2 中使用 Qt 示例 FlowLayout。

我发布了一个简单的示例 revision 2 here

(这是基于官方示例 here ,这就是为什么我如此不安它不能很好地工作。)

具体来说,当窗口足够大时它效果很好:

window works well when large wide window works well when large tall

但不会阻止窗口缩小,而 VBoxLayout 或 GridLayout 会:

window can be resized too small

我认为最小尺寸应该取决于当前的宽度。这应该是最小尺寸:

wide minimum size

这也应该是:

narrow minimum size is tall

如何获取布局以防止其父级缩小到其内容不可见?

sizeHint() 和minimumSize() 总是返回单个项目的大小,我认为这是问题所在。但是,如果我重写它们以考虑当前布局宽度的所有项目,则没关系,因为当我创建和填充布局时,两者仅被调用一次。

到目前为止,我最好的想法是从 heightForWidth() 调用 update(),大致如下:

def heightForWidth(self, width):
oldWidth = self.geometry().width() - 2 * self.contentsMargins().top()
oldHeight = self.doLayout(QtCore.QRect(0, 0, oldWidth, 0), True)
height = self.doLayout(QtCore.QRect(0, 0, width, 0), True)
print 'heightForWidth', width, oldWidth, height, oldHeight
if height != oldHeight:
self.update()
return height

更改了minimumSize和doLayout的完整示例是revision 3 。 有时它可以工作,但有几个问题:

  1. 首次创建布局时,会不断调用 update()。我认为对 update() 的调用会触发对 heightForWidth() 的调用,并且由于某种原因,传入的宽度并不接近我计算的“oldWidth”,直到我调整窗口大小,即使是单个像素。

  2. 一旦我调整窗口大小,对 heightForWidth() 的调用就会完全停止,minimumSize() 也会停止调用,并且我无法再将窗口大小调整为小于最后计算的大小。我不知道为什么。

  3. (不太重要)self.geometry().width() - 2 * self.contentsMargins().top() 不会返回最后传递给 heightForWidth 的宽度(即使上/下/左/右边距相同),尽管我从示例中的其他代码中获取了它。这通常并不重要,但在某些宽度下,它会导致一系列对 update() 的调用

我想我做错了。能做对吗?

最佳答案

您只能修改 setGeometry()minimumSize() 函数。我使用 C++ 工作,但很容易修改为 Python。

首先,我更改了 minimumSize() 返回的 QSize,以考虑布局的当前大小,然后设置返回的 QSize 的高度。然后,我在 setGeometry() 中调用 update() 来强制布局重新检查 sizeHint()。下面是代码示例。

QSize FlowLayout::minimumSize() const
{
QSize size;
for (const QLayoutItem *item : qAsConst(itemList))
{
size = size.expandedTo(item->minimumSize());
}
const QMargins margins = contentsMargins();
size += QSize(margins.left() + margins.right(), margins.top() + margins.bottom());

// ADDED CODE **************************************
auto layoutSize = this->contentsRect();
size.setHeight(heightForWidth(layoutSize.width()));
// *************************************************

return size;
}

void FlowLayout::setGeometry(const QRect &rect)
{
// ADDED CODE ************************************
update();
// ***********************************************
QLayout::setGeometry(rect);
doLayout(rect, false);
}

希望这有帮助。

关于python - Qt FlowLayout 示例 - 如何在布局更改时调用 sizeHint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55820951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com