郭震 AI公众号:郭震AI

26 PyQt5小白教程:多窗口应用之窗口间的通信

发布日期:

分类: PyQt5小白

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点7 个
图文要点0 张
正文规模1.2k 字

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

窗口间通信的基础

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

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

创建窗口间通信的示例

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

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

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

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 方法用于更新标签的文本内容。
  • MainWindow 类

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

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

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

    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(多文档界面)来管理多个窗口,期待与大家的继续学习!

    分享文章

    转发到常用平台

    微信/朋友圈可先复制链接

    相关内容

    更多相关文章

    返回栏目

    Reader Messages

    读者留言

    有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

    最多 800 字

    为了防刷,每条留言会做长度、链接数量和提交频率限制。

    0/800

    留言列表

    0
    正在加载留言...