PyQt:如何设置一个隐藏其他可见控件的控件?

4 投票
1 回答
8967 浏览
提问于 2025-04-17 13:08

假设我在我的界面上创建了两个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_())

撰写回答