调整QMainWindow大小以适应布局内容变化后的最小尺寸

4

我正在使用 QMainWindow 的子类,在其中声明了一个中央小部件。这个小部件包含了一个 QGridLayout,其中包含一组按钮。按钮的数量可以根据用户的输入增加或减少。间距设置为零,以便所有按钮都聚集在一起。默认情况下,它看起来像这样:

Layout by default

如果增加按钮的数量,网格和窗口也会相应地扩大;然而,如果减少按钮的数量,则会出现以下情况:

Layout done wrong

现在我想调整窗口/布局/小部件的大小,以便所有按钮都可以使用最小的空间。我尝试了各种方法,但都没有成功。我查看了thisthis的问题,以及Qt论坛中的各个线程,但它们都对我没用。
我的布局构建如下:
self.grid = QtGui.QGridLayout()
self.grid.setSpacing(0)

hBox = QtGui.QHBoxLayout()
hBox.addWidget(...)

vBox = QtGui.QVBoxLayout(self.widget)
vBox.addLayout(hBox)
vBox.addLayout(self.grid)

self.setCentralWidget(self.widget)

我尝试使用调整大小...

self.widget.layout().activate()
self.resize(self.minimumSize())
# self.resize(self.sizeHint())

我还尝试了使用其他方法,包括设置窗口和网格的大小策略。

3个回答

5

当小部件数量改变时,您可以将窗口调整为minimumSizeHint()

self.resize(minimumSizeHint())

这将缩小窗口至最小尺寸。但您需要考虑到,在事件循环中处理一些事件后才能计算出最小尺寸。因此,当按钮数量发生变化时,只需进行几次事件循环的处理,然后再调整大小至最小。

就像这样:

for i in range(0, 10):
      QApplication.processEvents()

self.resize(minimumSizeHint())

另一种选项是使用单次定时器 QTimer,调用一个槽函数,在该函数中将窗口大小调整为最小值。这样,当你调整窗口大小时,最小大小提示会被正确地计算。

非常感谢!我实际上尝试过 self.resize(minimumSizeHint()),但我不知道我还需要处理一些事件。这对我来说似乎有点“hackish”,但它确实有效。 - Steffen
我建议使用第二种方法(单次设置一个计时器)。 - Nejat

1
尽管这个问题已经有了答案,但我在这里找到了一个非常简单、优雅的解决方案。它很难找到,因为这个问题是关于Qt而不是PySide。你需要将它翻译成PySide,但这真的很简单。
基本上,你想要将你想要自动调整大小的布局的大小约束设置为QtGui.QLayout.SetFixedSize,像这样:
vBox = QtGui.QVBoxLayout(self.widget)
vBox.setSizeConstraint(QtGui.QLayout.SetFixedSize)

代码一点也不直观,但它能正常工作。

0

对于那些像我一样不太明白如何使用QTimer的人:

def function_with_blown_window_size(self)
    ...
    # 1 ms was too low for a refresh -> singleShot timer with 10ms delay
    QTimer.singleShot(10, self.window_size_readjust)

def window_size_readjust(self):
    self.adjustSize()                     # worked in my case
    #self.resize(self.minimumSizeHint())  # alternative worked equally well

请不要将“谢谢”作为答案。一旦您拥有足够的声望,您就可以投票支持有用的问题和答案。- 来自审核 - aaossa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接