PySide6自定义信号与槽实现两个窗口之前数据传递

一、自定义信号的总体流程

1、定义信号

2、定义槽函数

3、连接信号与槽函数

4、发射信号

二、子窗口与主窗口的设置流程如下:

 

显示效果:将输入的用户名:admin,密码:123456显示在label中

 

三、demo代码如下:

import sys

from PySide6.QtCore import *
from PySide6.QtWidgets import *

# 主窗口
class MainUi(QWidget):
    def __init__(self,parent=None):
        super(MainUi, self).__init__(parent)
        self.setWindowTitle('第一个窗口')
        self.resize(500,300)
        self.open_btn = QPushButton('打开')
        self.username = QLabel('默认文本')
        self.box = QHBoxLayout()
        self.box.addWidget(self.open_btn)
        self.box.addWidget(self.username)
        self.setLayout(self.box)
        self.open_btn.clicked.connect(self.get_data)

    # 实例化子窗口并获取子窗口返回数据
    def get_data(self):
        child_win = ChildWin()
        child_win.name_signal.connect(self.set_to_text)
        child_win.exec()

    # 传入用户名和密码并设置到显示框中
    def set_to_text(self,name,passwd):
        self.username.setText('用户名:{},密码:{}'.format(name,passwd))


# 子窗口
class ChildWin(QDialog):
    name_signal = Signal(str,str)       # 子窗信号,用于传递用户名
    def __init__(self,parent=None):
        super(ChildWin, self).__init__(parent)
        self.setWindowTitle('子窗口')
        self.resize(400,200)
        layout = QHBoxLayout()
        name = QLabel('用户名:')
        passwd = QLabel('密码:')
        self.namele = QLineEdit()
        self.passwdle = QLineEdit()
        self.commit_btn = QPushButton('提交')
        layout.addWidget(name)
        layout.addWidget(self.namele)
        layout.addWidget(passwd)
        layout.addWidget(self.passwdle)
        layout.addWidget(self.commit_btn)
        self.setLayout(layout)
        self.commit_btn.clicked.connect(self.get_name)      # 关连信号发信槽函数

    # 定义槽函数,用于获取用户名并发射信号
    def get_name(self):
        user_name = self.namele.text()      # 获取输入的用户名
        password = self.passwdle.text()     # 获取密码
        self.name_signal.emit(user_name,password)        # 发射信号
        self.close()    # 发射完信号后关闭窗口


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainUi()
    win.show()
    sys.exit(app.exec())

PySide6中,如果你想在同一操作在两个不同的Qt界面(QWidgets、QMainWindow等)上同时进行,你需要确保这些操作不会相互干扰,并且它们可以在各自的线程或者信号系统中独立处理。 1. **非阻塞操作**:对于那些可以并行执行的操作,比如更新UI元素的非关键任务,你可以将这些操作放入单独的线程(例如使用`QThread`),然后通过`emit`信号通知主线程或目标界面完成更新。 ```python from PySide6.QtCore import Qt, QThread, Signal class Worker(QThread): updateSignal = Signal(str) # 创建一个自定义信号 def run(self): # 进行耗时操作 result = "Update Data" self.updateSignal.emit(result) # 在主窗口函数中接收信号 def handle_update(signal_string): # 更新UI部分 your_ui_element.setText(signal_string) worker = Worker() worker.start() # 启动新线程 worker.updateSignal.connect(handle_update) # 连接信号函数 ``` 2. **信号机制**:如果操作需要在界面之间传递信息,可以使用Qt的信号(Signal-Slot)机制,创建一个通用的函数,在需要的地方连接它。 ```python from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() button = QPushButton("Click Me", self) button.clicked.connect(self.handle_click) def handle_click(self): other_window_instance.signal_function() # 调用其他窗口的方法 class OtherWindow(QMainWindow): signal_function = Signal(str) # 定义接收信号 # 在OtherWindow里定义响应这个信号函数 def slot_function(self, data): # 对数据进行处理并在自身界面展示 app = QApplication([]) main_win = MainWindow() other_win = OtherWindow() main_win.show() other_win.show() # 如果你想让某个操作同步执行,可以在函数内部加入锁或等待条件 other_win.signal_function.connect(main_win.handle_click) app.exec_() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值