PyQt:如何设置一个小部件,如果它可见,则隐藏另一个小部件?

4
假设我在我的界面(ui)中创建了两个QObject。我想要连接这两个小部件,并根据它们的视觉状态让它们彼此控制。如果其中一个被隐藏,另一个必须可见。反之亦然。
你能帮我吗? :)
谢谢!
Nico
1个回答

7
可能的解决方案:子类化小部件并覆盖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_())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接