26 多窗口应用之窗口间的通信

在上一篇文章中,我们学习了如何创建一个多窗口应用程序,了解了如何使用 QMainWindowQWidget 来组织多个窗口。在本篇中,我们将深入探讨如何在这些窗口之间进行通信。这种通信是构建复杂应用程序时非常重要的一个方面,因为它允许不同窗口共享数据和状态。

窗口间通信的基础

窗口间的通信在 PyQt5 中主要通过信号(Signals)和槽(Slots)机制实现。这种机制使得程序的不同部分可以彼此通知或响应事件。信号和槽的基本工作原理是:

  • 信号:当某个事件发生时,发出信号。
  • :响应信号的函数。一个信号可以连接到一个或多个槽。

创建窗口间通信的示例

让我们通过一个简单的示例来演示如何实现窗口间的通信。我们将创建两个窗口:MainWindowSecondWindow。点击 MainWindow 中的一个按钮将会在 SecondWindow 中显示一条消息。

第一步:创建主窗口和第二窗口

首先,我们需要创建这两个窗口。下面是 MainWindowSecondWindow 的基本代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget

class SecondWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.layout = QVBoxLayout()
self.label = QLabel('这是第二个窗口')
self.layout.addWidget(self.label)
self.setLayout(self.layout)

def update_label(self, text):
self.label.setText(text)

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.second_window = SecondWindow()
self.initUI()

def initUI(self):
self.setWindowTitle('主窗口')
self.setGeometry(100, 100, 300, 200)

button = QPushButton('打开第二个窗口并发送消息', self)
button.clicked.connect(self.show_second_window)

self.setCentralWidget(button)

def show_second_window(self):
self.second_window.update_label('消息来自主窗口!')
self.second_window.show()

if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())

代码解析

  1. SecondWindow 类

    • 这是第二个窗口,里面有一个 QLabel 用于显示文本信息。
    • update_label 方法用于更新标签的文本内容。
  2. MainWindow 类

    • 创建了一个 QPushButton 用于打开第二个窗口。
    • show_second_window 方法在按钮点击时被调用,此时更新第二窗口的标签,并显示窗口。

第二步:连接信号和槽

上面的代码使用按钮点击来触发窗口间的通信。实际上,我们可以通过自定义的信号来实现更复杂的通信机制。例如,如果 SecondWindow 需要通知回 MainWindow,我们可以使用信号。

让我们改进一下 SecondWindow,使其能发送一个信号通知 MainWindow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from PyQt5.QtCore import pyqtSignal

class SecondWindow(QWidget):
# 定义一个信号
message_signal = pyqtSignal(str)

def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.layout = QVBoxLayout()
self.label = QLabel('这是第二个窗口')
self.layout.addWidget(self.label)

# 添加确认按钮
confirm_button = QPushButton('确认消息', self)
confirm_button.clicked.connect(self.confirm_message)
self.layout.addWidget(confirm_button)

self.setLayout(self.layout)

def update_label(self, text):
self.label.setText(text)

def confirm_message(self):
self.message_signal.emit('确认来自第二个窗口!') # 发送信号

# 在 MainWindow 中连接信号
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.second_window = SecondWindow()
# 连接信号和槽
self.second_window.message_signal.connect(self.receive_message)
self.initUI()

def initUI(self):
self.setWindowTitle('主窗口')
self.setGeometry(100, 100, 300, 200)

button = QPushButton('打开第二个窗口并发送消息', self)
button.clicked.connect(self.show_second_window)

self.setCentralWidget(button)

def show_second_window(self):
self.second_window.update_label('消息来自主窗口!')
self.second_window.show()

def receive_message(self, message):
print(message) # 接收来自第二个窗口的消息

改进的代码解析

  1. 信号的定义

    • SecondWindow 中定义了一个信号 message_signal,并在 confirm_message 方法中发射该信号。
  2. 信号和槽的连接

    • MainWindow 中,当创建 SecondWindow 时同时连接信号和槽,使得 receive_message 方法能捕获 SecondWindow 发射的消息。

总结

通过这个示例,我们展示了如何在多个窗口之间进行通信。我们创建了两个窗口类,并利用 QPushButton 和信号槽机制实现了从主窗口到第二窗口的信息传递,反之亦然。这种通信机制是构建复杂应用程序的重要基础。

在下一篇文章中,我们将进一步探讨使用 MDI(多文档界面)来管理多个窗口,期待与大家的继续学习!

26 多窗口应用之窗口间的通信

https://zglg.work/pyqt5-you-need/26/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论