2016-02-19 234 views
2

下面是一个简单的例子:如何在隐藏窗口小部件后调整窗口大小,同时仍允许调整窗口大小?

from PyQt4 import QtCore, QtGui 
import sys 

class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     self.app = QtGui.QApplication(sys.argv) 
     super(MainWindow, self).__init__() 

     self.button = QtGui.QPushButton('Show/Hide') 
     self.button.setCheckable(True) 
     self.frame = QtGui.QFrame() 
     self.frame.setFixedHeight(100) 
     layout = QtGui.QVBoxLayout() 
     layout2 = QtGui.QVBoxLayout() 
     self.setLayout(layout) 
     self.frame.setLayout(layout2) 

     layout.addWidget(self.button) 
     layout.addWidget(self.frame) 
     layout.addStretch(1) 
     layout2.addWidget(QtGui.QLabel('Yoyoyo')) 

     self.button.toggled.connect(self.clickAction) 

    def startup(self): 
     self.show() 
     sys.exit(self.app.exec_()) 

    def clickAction(self): 
     checked = self.button.isChecked() 
     if checked: 
      self.frame.show() 
     else: 
      self.frame.hide() 
if __name__ == "__main__": 
    myApp = MainWindow() 
    myApp.startup() 

当按钮被切换,示出了帧/隐藏适当。我意识到,如果我设置MainWindow小号sizeConstraintSetFixedSize如下:

layout.setSizeConstraint(QtGui.QLayout.SetFixedSize) 

,窗口将调整像我想要的。不过,我希望用户仍然可以调整窗口大小,SetFixedSize不允许我这样做。

因此,我怎样才能实现一个用户可调整大小的窗口,同时仍然根据它的内容调整大小?

回答

2

根据找到的对话here我能够得到这个工作。解决方案包括在显示/隐藏帧后添加QTimerQTimer称为resizeMe方法,其也在下面定义。

from PyQt4 import QtCore, QtGui 
import sys 

class MainWindow(QtGui.QWidget): 
    def __init__(self): 
     self.app = QtGui.QApplication(sys.argv) 
     super(MainWindow, self).__init__() 

     self.button = QtGui.QPushButton('Show/Hide') 
     self.button.setCheckable(True) 
     self.frame = QtGui.QFrame() 
     self.frame.setFixedHeight(100) 
     self.layout = layout = QtGui.QVBoxLayout() 
     layout2 = QtGui.QVBoxLayout() 
     self.setLayout(layout) 
     self.frame.setLayout(layout2) 

     layout.addWidget(self.button) 
     layout.addWidget(self.frame) 
     layout.addStretch(1) 
     layout2.addWidget(QtGui.QLabel('Yoyoyo')) 

     self.button.toggled.connect(self.clickAction) 

    def startup(self): 
     self.show() 
     sys.exit(self.app.exec_()) 

    def clickAction(self): 
     checked = self.button.isChecked() 
     if checked: 
      self.frame.show() 
     else: 
      self.frame.hide() 
     QtCore.QTimer.singleShot(0, self.resizeMe) 

    def resizeMe(self): 
     self.resize(self.minimumSizeHint()) 
if __name__ == "__main__": 
    myApp = MainWindow() 
    myApp.startup()