pyqt5中的多窗口交互(数据的传输方式)

pyqt5中的多窗口数据交互有多种方式:
方式1:直接访问控件数据—一般不推荐使用(代码的耦合度高)
方式2:通过信号来传输数据,推荐使用,代码的耦合度低,可操作性强
主窗口的代码:

#coding=utf8
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
"""
多窗口交互---直接访问对应的控件,代码的耦合度高
方式1 直接访问控件
"""

# from DataDialog import DateDialog
#
# class MultiWindow1(QWidget):
#     def __init__(self):
#         super().__init__()
#         self.setWindowTitle(" 多窗口交互")
#
#         self.lineEdit = QLineEdit(self)
#         self.button1 = QPushButton('弹出对话框1')
#         self.button1.clicked.connect(self.onButton1Click)
#
#         self.button2 = QPushButton('弹出对话框2')
#         self.button2.clicked.connect(self.onButton2Click)
#
#         gridLayout = QGridLayout()
#         gridLayout.addWidget(self.button1)
#         gridLayout.addWidget(self.button2)
#         gridLayout.addWidget(self.lineEdit)
#
#         self.setLayout(gridLayout)
#
#     def onButton1Click(self):
#         dialog = DateDialog(self)
#         # 对话框保持悬浮
#         result = dialog.exec()
#         date = dialog.dateTime()
#         self.lineEdit.setText(date.date().toString())
#         dialog.destroy()
#
#     def onButton2Click(self):
#         date,time,result = DateDialog.getDateTime()
#         self.lineEdit.setText(date.toString())
#         if result == QDialog.Accepted:
#             print("点击确定按钮")
#         else:
#             print('单击取消按钮')
"""
多窗口交互,使用信号与槽函数
这样就可以降低代码的耦合度: 信号:创建、触发、连接
"""
from DataDialog import DateDialog

class MultiWindow1(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(" 多窗口交互")

        self.lineEdit = QLineEdit(self)
        self.button1 = QPushButton('弹出对话框1')
        self.button1.clicked.connect(self.onButton1Click)

        self.button2 = QPushButton('弹出对话框2')
        self.button2.clicked.connect(self.onButton2Click)

        gridLayout = QGridLayout()
        gridLayout.addWidget(self.button1)
        gridLayout.addWidget(self.button2)
        gridLayout.addWidget(self.lineEdit)

        self.setLayout(gridLayout)

    def onButton1Click(self):
        dialog = DateDialog(self)
        """
        这是直接访问
        """
        # date = dialog.dateTime()
        # self.lineEdit.setText(date.date().toString())
        """
        使用信号访问,信号连接槽,,多窗口交互的时候尽量使用信号来传数据--尽量避免直接访问控件
        创建---在子窗口
        触发---在子窗口
        信号一旦触发就会执行绑定的槽函数------所以说用信号来传输数据是最佳的载体
        绑定---在主窗口
        """
        # 绑定
        dialog.Signal_parp.connect(self.deal_emit_slot)
        dialog.show()
        # dialog.destroy()

    def deal_emit_slot(self,datestr):
        # self.lineEdit.setText("1234")
        self.lineEdit.setText(datestr)

    def onButton2Click(self):
        date,time,result = DateDialog.getDateTime()
        self.lineEdit.setText(date.toString())
        if result == QDialog.Accepted:
            print("点击确定按钮")
        else:
            print('单击取消按钮')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MultiWindow1()
    window.show()
    app.exec_()
    

子窗口的代码(使用子窗口的控件访问数据,使用子窗口的信号传输数据)

#coding=utf8
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class DateDialog(QDialog):
    # 信号的定义
    Signal_parp = pyqtSignal(str)
    def __init__(self,parent=None):
        super(DateDialog,self).__init__(parent)
        self.setWindowTitle("DataDialog")
        layout = QVBoxLayout(self)
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())

        layout.addWidget(self.datetime)

        button = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel,Qt.Horizontal,self)
        button.accepted.connect(self.accept)
        button.rejected.connect(self.reject)
        layout.addWidget(button)

        self.button = QPushButton("发送")

        # self.button.clicked.connect(self.onClickButton)
        # 日历控件时间改变的事件和之前的clicked事件是一样的都需要绑定槽函数
        self.datetime.dateTimeChanged.connect(self.onClickButton)

        # 使用按键触发---来导致信号触发
        self.button.clicked.connect(self.buttonClicked)
        layout.addWidget(self.button)
    # 信号的触发可以通过其他控件来触发----控件本身就有触发机制
    def onClickButton(self):
        data_str = self.datetime.dateTime().toString()
        print("触发了")
        print(data_str)
        # 信号的触发
        self.Signal_parp.emit(data_str)
    # 按键触发---->导致信号触发试试
    def buttonClicked(self):
        data_str = self.datetime.dateTime().toString()
        self.Signal_parp.emit(data_str)

    def dateTime(self):
        return self.datetime.dateTime()

    @staticmethod
    def getDateTime(parent = None):
        dialog = DateDialog(parent)
        result = dialog.exec()
        date = dialog.dateTime()
        return (date.date(),date.time(),result == QDialog.Accepted)

直接测试使用,推荐使用信号来进行数据交互

  • 6
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PYQT5,可以通过多线程和信号来实现多窗口交互。 首先,你需要创建多个窗口。每个窗口可以是一个独立的QWidget或QDialog对象。可以使用QWidget或QDialog类来创建这些窗口。每个窗口都可以有自己的UI设计和逻辑。 然后,你可以使用多线程来处理每个窗口的逻辑。可以使用QThread类来创建和管理线程。你可以在每个线程处理特定窗口的逻辑和操作。 为了实现多窗口交互,你可以使用信号和槽机制。在每个窗口的类定义信号,并在需要的时候发送信号。其他窗口可以连接这些信号,并在接收到信号时执行相应的操作。可以使用pyqtSignal来定义信号,并使用emit方法发送信号。 例如,你可以在一个窗口类定义一个信号,并在另一个窗口类连接这个信号。当第一个窗口发出这个信号时,第二个窗口就会执行与这个信号关联的槽函数。 下面是一个简单的例子来说明pyqt5多窗口交互的实现: ```python from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QApplication, QWidget, QPushButton # 定义一个包含信号的类 class Window1(QWidget): signal = pyqtSignal(str) def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("Window 1") self.setGeometry(100, 100, 300, 200) button = QPushButton("Send Signal", self) button.clicked.connect(self.sendSignal) def sendSignal(self): self.signal.emit("Hello from Window 1!") # 定义另一个窗口类 class Window2(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle("Window 2") self.setGeometry(500, 100, 300, 200) self.show() # 定义槽函数来接收信号 def receiveSignal(self, message): print("Received Signal:", message) # 创建应用程序并显示窗口 app = QApplication([]) window1 = Window1() window2 = Window2() # 连接信号和槽函数 window1.signal.connect(window2.receiveSignal) window1.show() app.exec_() ``` 在上面的例子,我们创建了两个窗口类`Window1`和`Window2`。`Window1`类定义了一个信号`signal`,并在按钮点击事件发送这个信号。`Window2`类定义了一个槽函数`receiveSignal`,用于接收来自`Window1`的信号。在主程序,我们创建了这两个窗口的实例,并将`Window1`的信号连接到`Window2`的槽函数。当`Window1`发出信号时,`Window2`的槽函数会被触发,输出接收到的消息。 通过使用这种方式,你可以实现多个窗口之交互,并根据需要发送和接收信号来执行相关操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [PYQT5开启多个线程和窗口,多线程与多窗口交互实例](https://blog.csdn.net/xujianjun229/article/details/118560341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值