编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

15.5 PyQt5-SignalSlot自定义信号实现多窗口交互

wxchong 2025-03-20 20:15:19 开源技术 26 ℃ 0 评论

1.简介

通过自定义信号的方式将主窗口和子窗口进行数据交互。

2.案例

  • main.py
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QPushButton, QLineEdit

from DateDialog_2 import DateDialog

"""
    当DateDialog子窗口中的日历控件选择修改日期后,通过自定义信号传递给主窗口中进行显示
"""


class MultiWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('自定义信号实现多窗口交互')
        self.resize(600, 400)
        self.line = QLineEdit()

        self.btn1 = QPushButton('获取时间')
        # 第一步,执行按钮绑定的槽函数方法
        self.btn1.clicked.connect(self.date_dialog)

        g_layout = QGridLayout(self)
        g_layout.addWidget(self.line)
        g_layout.addWidget(self.btn1)

    def date_dialog(self):
        # 第二步,初始化DateDialog方法
        dd = DateDialog(self)
        # 第三步,绑定子窗口自定义信号与主窗口槽函数
        dd.get_datetime.connect(self.signal_get_data)  # 主窗口调用子窗口的自定义信号并绑定槽函数来设置主窗口显示的内容
        # 第四步,展示子窗口
        dd.show()

    def signal_get_data(self, d):
        print(d)
        # 参数d为子窗口,自定义信号发射时传递的日期参数。
        self.line.setText(d)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MultiWindow()
    w.show()
    sys.exit(app.exec())
  • DateDialog_2.py
from PyQt5.QtWidgets import QDialog, QDateTimeEdit, QDialogButtonBox, QVBoxLayout
from PyQt5.QtCore import Qt, QDateTime, pyqtSignal

"""
    定义日历窗口
"""

class DateDialog(QDialog):
    get_datetime = pyqtSignal(str)

    def __init__(self, p):
        super(DateDialog, self).__init__(p)
        self.setWindowTitle('日期')
        v_layout = QVBoxLayout(self)

        self.dte = QDateTimeEdit()
        self.dte.setCalendarPopup(True)
        self.dte.setDateTime(QDateTime.currentDateTime())

        v_layout.addWidget(self.dte)

        # 创建窗口按钮
        btn_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        btn_box.accepted.connect(self.accept)
        btn_box.rejected.connect(self.reject)

        v_layout.addWidget(btn_box)

        # 第五步,当子窗口修改日期时,触发日期修改槽函数
        self.dte.dateChanged.connect(self.emit_signal)  # 当日历控件日期修改时触发当前事件

    def emit_signal(self):
        # 第六步,获取当前时间,并初始化字符串
        date = self.dte.dateTime().toString()  # 获取当前时间
        print(date)
        # 第七步,执行信号
        self.get_datetime.emit(date)  # 发射信号,并将修改后的日期传递给主窗口自定义信号绑定的槽函数中

3.运行结果

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表