PyQt:如何设置一个小部件隐藏其他小部件,如果它是可见的?

问题描述:

比方说,我在我的界面(UI)中创建了两个QObject。我想连接这两个小部件,并根据它们的视觉状态让它们相互控制。如果其中一个隐藏,另一个必须可见。反之亦然。PyQt:如何设置一个小部件隐藏其他小部件,如果它是可见的?

你能帮我吗? :)

谢谢!

尼科

可能的解决办法:Sublclass部件和覆盖hideEventshowEvent

#!/usr/bin/env python 
import sys 
from PyQt4 import QtCore, QtGui 


class CustomWidget(QtGui.QLabel): 
    signal_hided = QtCore.pyqtSignal() 
    signal_shown = QtCore.pyqtSignal() 
    def hideEvent(self, event): 
     print 'hideEvent' 
     super(CustomWidget, self).hideEvent(event) 
     self.signal_hided.emit() 

    def showEvent(self, event): 
     print 'showEvent' 
     super(CustomWidget, self).showEvent(event) 
     self.signal_shown.emit() 


class MainWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.widget1 = CustomWidget('Widget1') 
     self.widget2 = CustomWidget('Widget2') 

     # connect signals, so if one widget is hidden then other is shown 
     self.widget1.signal_hided.connect(self.widget2.show) 
     self.widget2.signal_hided.connect(self.widget1.show) 
     self.widget2.signal_shown.connect(self.widget1.hide) 
     self.widget1.signal_shown.connect(self.widget2.hide) 

     # some test code 
     self.button = QtGui.QPushButton('test') 
     layout = QtGui.QVBoxLayout() 
     layout.addWidget(self.button) 
     layout.addWidget(self.widget1) 
     layout.addWidget(self.widget2) 
     self.setLayout(layout) 
     self.button.clicked.connect(self.do_test) 

    def do_test(self): 
     if self.widget1.isHidden(): 
      self.widget1.show() 
     else: 
      self.widget2.show() 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    widget = MainWidget() 
    widget.resize(640, 480) 
    widget.show() 

    sys.exit(app.exec_()) 
+0

谢谢!它很棒! :) – NicoCati 2012-02-24 09:19:57