pyqt 不同窗口怎么相互通讯?
在 PyQt 中,不同窗口之间可以使用信号(signal)和槽(slot)的机制进行通信。具体来说,一个窗口可以发出一个信号,另一个窗口可以连接这个信号,并在收到信号时执行对应的槽函数。
以下是一个简单的示例代码,演示了如何在两个窗口之间传递文本数据:
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QLineEdit
from PyQt5.QtCore import pyqtSignal, QObject
class Window1(QMainWindow):
text_changed = pyqtSignal(str)
def __init__(self):
super().__init__()
self.setWindowTitle('Window 1')
self.line_edit = QLineEdit()
self.line_edit.textChanged.connect(self.on_text_changed)
self.setCentralWidget(self.line_edit)
def on_text_changed(self, text):
self.text_changed.emit(text)
class Window2(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('Window 2')
self.label = QLabel()
layout = QVBoxLayout()
layout.addWidget(self.label)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def on_text_changed(self, text):
self.label.setText(text)
class Communicate(QObject):
text_changed = pyqtSignal(str)
def main():
app = QApplication([])
window1 = Window1()
window2 = Window2()
communicate = Communicate()
communicate.text_changed.connect(window2.on_text_changed)
window1.text_changed.connect(communicate.text_changed)
window1.show()
window2.show()
app.exec_()
if __name__ == '__main__':
main()
在这个示例中,我们创建了两个窗口 Window1 和 Window2,以及一个通信类 Communicate。Window1 中有一个文本框,当文本框中的文本发生变化时,就会发出 text_changed 信号。Communicate 类中有一个同名的信号,用于将 Window1 的信号连接到 Window2 的槽函数 on_text_changed 中。当 Window2 接收到 text_changed 信号时,就会调用 on_text_changed 方法,将文本设置为标签的文本。
在 main 函数中,我们创建了 Window1、Window2 和 Communicate 的实例,并将它们连接起来。最后,我们显示这两个窗口,启动 PyQt 的事件循环。
这样,当在 Window1 的文本框中输入文本时,Window2 的标签就会立即更新为相同的文本。