2015-01-29 6 views
0

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

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

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

NameError: name 'QWIDGETSIZE_MAX' is not defined 

ответ

1

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

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

, который также работает на окнах, большое спасибо! – Igor

1

Используйте 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_() 
+0

Спасибо! После первого нажатия кнопки в вашем примере размер окна изменяется только один раз. Зачем? В моем приложении это не работает: окно закрывается немедленно, если я использую 'self.setFixedSize (self.sizeHint())'. Возможно, потому что мой виджет больше видимой области окна? – Igor

 Смежные вопросы

  • Нет связанных вопросов^_^