布局内容更改后,将 QMainWindow 调整为最小尺寸

Vel*_*ria 4 python layout qt pyqt qmainwindow

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

默认布局

如果按钮数量增加,网格和窗口会增长得很好;但是,如果按钮数量减少,它将如下所示:

布局错了

现在我想调整窗口/布局/小部件的大小,以便所有按钮都可以使用最小的空间。我尝试了各种方法,但都无济于事。我查看了这个这个问题,以及 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)
Run Code Online (Sandbox Code Playgroud)

我试着用...调整它的大小

self.widget.layout().activate()
self.resize(self.minimumSize())
# self.resize(self.sizeHint())
Run Code Online (Sandbox Code Playgroud)

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

Nej*_*jat 5

您可以在minimumSizeHint()更改小部件数量后将窗口大小调整为:

self.resize(minimumSizeHint())
Run Code Online (Sandbox Code Playgroud)

这会将窗口缩小到最小尺寸。但是您应该考虑到在事件循环中处理某些事件之前不会计算最小大小。所以当按钮的数量改变时,只需处理一些迭代的事件循环,然后调整到最小。

就像是 :

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

self.resize(minimumSizeHint())
Run Code Online (Sandbox Code Playgroud)

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