如何在 setFixedSize() 之后再次调整 main window 的大小?

How to resize the main window again after setFixedSize()?

我想在使一些小部件不可见后调整 MainWindow (QMainWindow) 的大小,反之亦然。我想阻止 window 调整大小。

def hideAndShowWidget(self):
        self.widgetObject.setVisible(not self.widgetObject.isVisible() )
        # change main window size here
        # ...
        self.setFixedSize(self.width(), self.height())

我的问题是,我无法在第一次调用 setFixedSize() 后更改 window 大小。我读到 here 我必须使用 QWIDGETSIZE_MAX() 来删除约束,但我不知道我该如何使用它,我得到错误:

NameError: name 'QWIDGETSIZE_MAX' is not defined

使用sizeHint()。它包含小部件想要的大小。将固定尺寸准确设置为尺寸提示。

工作示例:

from PySide import QtGui

class Window(QtGui.QMainWindow):

    def __init__(self):
        super().__init__()
        self.setFixedSize(400, 300)

        widget = QtGui.QWidget()
        layout = QtGui.QVBoxLayout(widget)
        button = QtGui.QPushButton('Toggle visibility')
        button.clicked.connect(self.hideAndShowWidget)
        layout.addWidget(button)
        self.widgetObject = QtGui.QLabel('Test')
        layout.addWidget(self.widgetObject)
        self.setCentralWidget(widget)

    def hideAndShowWidget(self):
        self.widgetObject.setVisible(not self.widgetObject.isVisible() )
        # change main window size
        self.setFixedSize(self.sizeHint())


app = QtGui.QApplication([])
w = Window()
w.show()
app.exec_()

我认为你的机制或多或少是正确的。您只需确保高度计算正确完成(即在小部件的可见性发生变化之前)。

以下示例对我来说是正确的(虽然只在 Linux 上测试过):

from PySide import QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.widgetObject = QtGui.QTextEdit(self)
        self.button = QtGui.QPushButton('Hide Widget', self)
        self.button.clicked.connect(self.hideAndShowWidget)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button)
        layout.addWidget(self.widgetObject)
        self.setFixedSize(300, 200)

    def hideAndShowWidget(self):
        height = self.height()
        if self.widgetObject.isVisible():
            height -= self.widgetObject.height()
            self.widgetObject.setVisible(False)
            self.button.setText('Show Widget')
        else:
            height += self.widgetObject.height()
            self.widgetObject.setVisible(True)
            self.button.setText('Hide Widget')
        self.setFixedSize(self.width(), height)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())