Как снова изменить размер главного окна после setFixedSize()?

Я хотел бы изменить размер MainWindow (QMainWindow) после того, как некоторые виджеты станут невидимыми, и наоборот. И я хочу заблокировать изменение размера окна.

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

Моя проблема в том, что я не могу изменить размер окна после первого вызова setFixedSize(). Я прочитал здесь что я должен использовать QWIDGETSIZE_MAX() для снятия ограничений, но я не знаю, как я могу его использовать, я получаю сообщение об ошибке:

NameError: name 'QWIDGETSIZE_MAX' is not defined

person Igor    schedule 29.01.2015    source источник


Ответы (2)


Я думаю, что у вас более или менее правильный механизм. Вам просто нужно убедиться, что расчет высоты выполнен правильно (т.е. до изменения видимости виджета).

Следующий пример у меня работает корректно (хотя тестировался только в 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_())
person ekhumoro    schedule 30.01.2015

Используйте 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_()
person Trilarion    schedule 30.01.2015
comment
Спасибо! После первого нажатия на кнопку в вашем примере размер окна изменяется только один раз. Почему? В моем приложении это не работает: окно сразу закрывается, если я использую self.setFixedSize(self.sizeHint()). Возможно, потому что мой виджет больше видимой области окна? - person Igor; 30.01.2015