代码之家  ›  专栏  ›  技术社区  ›  spitfiredd

PYQT:如何从主窗口(父窗口)向子窗口发送自定义信号?

  •  2
  • spitfiredd  · 技术社区  · 6 年前

    如何从父窗口/主窗口向子窗口发送信号?

    mainSignal 到底是哪一个 widgetA widgetB

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class widgetB(QtWidgets.QWidget):
    
        procDone = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(widgetB, self).__init__(parent)
    
            self.lineEdit = QtWidgets.QLineEdit(self)
            self.button = QtWidgets.QPushButton("Send Message to A", self)
            self.layout = QtWidgets.QHBoxLayout(self)
            self.layout.addWidget(self.lineEdit)
            self.layout.addWidget(self.button)
    
            self.button.clicked.connect(self.on_button_clicked)
    
        @QtCore.pyqtSlot()
        def on_button_clicked(self):
            self.procDone.emit(self.lineEdit.text())
    
        @QtCore.pyqtSlot(str)
        def on_procStart(self, message):
            self.lineEdit.setText("From A: " + message)
    
            self.raise_()
    
    
    class widgetA(QtWidgets.QWidget):
        procStart = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(widgetA, self).__init__(parent)
    
            self.lineEdit = QtWidgets.QLineEdit(self)
            self.lineEdit.setText("Hello!")
    
            self.button = QtWidgets.QPushButton("Send Message to B", self)
            self.button.clicked.connect(self.on_button_clicked)
    
            self.layout = QtWidgets.QHBoxLayout(self)
            self.layout.addWidget(self.lineEdit)
            self.layout.addWidget(self.button)
    
        @QtCore.pyqtSlot()
        def on_button_clicked(self):
            self.procStart.emit(self.lineEdit.text())
    
        @QtCore.pyqtSlot(str)
        def on_widgetB_procDone(self, message):
            self.lineEdit.setText("From B: " + message)
    
            self.raise_()
    
    
    class mainwindow(QtWidgets.QMainWindow):
        mainSignal = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(mainwindow, self).__init__(parent)
    
            self.button = QtWidgets.QPushButton("Click Me", self)
            self.button.clicked.connect(self.on_button_clicked)
    
            self.setCentralWidget(self.button)
    
            self.widgetA = widgetA()
            self.widgetB = widgetB()
    
            self.widgetA.procStart.connect(self.widgetB.on_procStart)
            self.widgetB.procDone.connect(self.widgetA.on_widgetB_procDone)
    
        @QtCore.pyqtSlot()
        def on_button_clicked(self):
            self.widgetA.show()
            self.widgetB.show()
    
            self.widgetA.raise_()
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        main = mainwindow()
        main.show()
        sys.exit(app.exec_())
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   eyllanesc Yonghwan Shin    6 年前

    逻辑是相同的,在这里,它们是否是父对象、子对象等并不重要。只需要两个对象都可以同时访问。信号和插槽的设计使得类是独立的。

    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class widgetB(QtWidgets.QWidget):
    
        procDone = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(widgetB, self).__init__(parent)
    
            self.lineEdit = QtWidgets.QLineEdit(self)
            self.button = QtWidgets.QPushButton("Send Message to A", self)
            self.layout = QtWidgets.QHBoxLayout(self)
            self.layout.addWidget(self.lineEdit)
            self.layout.addWidget(self.button)
    
            self.button.clicked.connect(self.on_button_clicked)
    
        @QtCore.pyqtSlot()
        def on_button_clicked(self):
            self.procDone.emit(self.lineEdit.text())
    
        @QtCore.pyqtSlot(str)
        def on_procStart(self, message):
            self.lineEdit.setText("From A: " + message)
    
            self.raise_()
    
        @QtCore.pyqtSlot(str)
        def on_message_from_main(self, text):
            self.lineEdit.setText("From Main: " + text)
    
    class widgetA(QtWidgets.QWidget):
        procStart = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(widgetA, self).__init__(parent)
    
            self.lineEdit = QtWidgets.QLineEdit(self)
            self.lineEdit.setText("Hello!")
    
            self.button = QtWidgets.QPushButton("Send Message to B", self)
            self.button.clicked.connect(self.on_button_clicked)
    
            self.layout = QtWidgets.QHBoxLayout(self)
            self.layout.addWidget(self.lineEdit)
            self.layout.addWidget(self.button)
    
        @QtCore.pyqtSlot()
        def on_button_clicked(self):
            self.procStart.emit(self.lineEdit.text())
    
        @QtCore.pyqtSlot(str)
        def on_widgetB_procDone(self, message):
            self.lineEdit.setText("From B: " + message)
            self.raise_()
    
        @QtCore.pyqtSlot(str)
        def on_message_from_main(self, text):
            self.lineEdit.setText("From Main: " + text)
    
    
    class mainwindow(QtWidgets.QMainWindow):
        mainSignal = QtCore.pyqtSignal(str)
    
        def __init__(self, parent=None):
            super(mainwindow, self).__init__(parent)
    
            self.button = QtWidgets.QPushButton("Click Me", self)
            self.button.clicked.connect(self.on_button_clicked)
    
            self.setCentralWidget(self.button)
    
            self.widgetA = widgetA()
            self.widgetB = widgetB()
    
            self.widgetA.procStart.connect(self.widgetB.on_procStart)
            self.widgetB.procDone.connect(self.widgetA.on_widgetB_procDone)
    
            self.mainSignal.connect(self.widgetA.on_message_from_main)
            self.mainSignal.connect(self.widgetB.on_message_from_main)
    
        @QtCore.pyqtSlot()
        def on_button_clicked(self):
            self.widgetA.show()
            self.widgetB.show()
    
            self.widgetA.raise_()
    
            self.mainSignal.emit("Hello")
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtWidgets.QApplication(sys.argv)
        main = mainwindow()
        main.show()
        sys.exit(app.exec_())