关于python:在布局内容更改后将QMainWindow调整为最小大小

Resize QMainWindow to minimal size after content of layout changes

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

Layout

如果增加按钮的数量,则网格和窗口将增长得恰到好处;但是,如果减少了按钮的数量,它将如下所示:

Layout

现在,我想调整窗口/布局/小部件的大小,以便所有按钮都可以使用最小的空间。我已经尝试了各种方法,但都无济于事。我看过这个问题和这个问题,以及Qt板中的各种线程,但没有一个对我有用。

我的布局如下构建:

1
2
3
4
5
6
7
8
9
10
11
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)

我尝试使用...

调整其大小

1
2
3
self.widget.layout().activate()
self.resize(self.minimumSize())
# self.resize(self.sizeHint())

...和其他各种方法。我还尝试设置窗口和网格的大小策略。


更改小部件数量后,可以将窗口的大小调整为

1
self.resize(minimumSizeHint())

这会将窗口缩小到最小尺寸。但是,您应该考虑到只有在事件循环中处理了一些事件之后,才会计算出最小大小。因此,当更改按钮数量时,只需处理事件循环进行一些迭代,然后将其大小调整为最小即可。

就像:

1
2
3
4
for i in range(0, 10):
      QApplication.processEvents()

self.resize(minimumSizeHint())

另一种选择是单拍QTimer,该QTimer会调用一个插槽,您可以在其中将窗口调整为最小尺寸。这样,当您调整窗口大小时,最小大小提示将正确计算。