python -- pyQt5中 不同窗口的值传递 -实现从主窗口打开子窗口并进行窗口间数据传递的方法

参考:
https://blog.csdn.net/weixin_42818665/article/details/104246058

改变文本(textChanged)https://blog.csdn.net/ouening/article/details/117407499

设置文本(setText)https://www.jianshu.com/p/60561380f789

创建多窗口:https://zhuanlan.zhihu.com/p/611213540

一、方法

主窗口实例化, self.Settings.signal_tuple.connect(self.thread_finished) ,再连接信号和处理函数;self.Settings.start() # 线程的 start() 方法被调用时,就会自动执行run方法;

子窗口实例化,定义一个信号( signal_tuple = Signal(str) ),然后通过 emit 发射该信号,最后在主窗口上将该信号绑定到槽函数进而获取子窗口传递的消息。

二、代码

main.py

class MainWindow(LayoutWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
		self.win = yiqi_ui.Ui_MainWindow()
		self.win.setupUi(self)
		self. Show()

主界面实例化


    def go_to_Settings(self, checked):
        print("打开设置 ", checked)
        self.Settings = SettingsWindow()
        self.widget = QtWidgets.QWidget()
        self.Settings.setupUi(self.widget)  # 二级界面初始化UI
        self.Settings.show()

        self.Settings.signal_tuple.connect(self.thread_finished)  # 将实例化后的signal_tuple信号连接到thread_finished函数
        self.Settings.start()  # 线程的 start() 方法被调用时,就会自动执行run方法;

    @Slot(tuple)
    def thread_finished(self, path_value):  # 槽函数,当signal_tuple发出信号时,这Slot(槽函数)将被调用,并修改label 的显示
        self.win.lineEdit_2.setText(path_value)

Settings .py

class SettingsWindow(QtWidgets.QWidget, Ui_Form):  # QtWidgets.QWidget, Ui_Form
    signal_tuple = Signal(str)  # 创建了一个 signal_tuple信号
    
    def __init__(self):
        super().__init__()

        self.Settings_UI = Ui_Form()
        self.Settings_UI.setupUi(self)
        self. Show()
    def run(self): 
        try:
            path_data = result1_data + '-' + result2_data + '-' + result3_data
            print(path_data)
            self.Settings_UI.lineEdit_18.setText(path_data)  # 获取LineEdit数据

            # global_manage._init()
            global_manage.set_value('path_data', path_data)  # 为全局变量赋值 --路径

            self.signal_tuple.emit(path_data)  # 任务完成后发出信号

            QtWidgets.QMessageBox.information(self, "提示", "确定", QtWidgets.QMessageBox.Yes)
        except Exception as r:
            print("路径未选择:", r)
            QMessageBox.warning(self, "警告", "请选择路径!", QtWidgets.QMessageBox.Yes)

例子 + 完整代码

实现的功能:
创建主窗口,在主窗口中点击按钮,弹出子窗口
在子窗口中输入字符串,点击<发送>按钮
在主窗口中显示子窗口中输入的字符串
在这里插入图片描述

from PySide6.QtWidgets import QApplication
from PySide6.QtWidgets import QWidget, QDialog, QPushButton, QLabel, QLineEdit
from PySide6.QtCore import Signal  # from PyQt5.QtCore import pyqtSignal
import sys


class MyDialog(QDialog):

    mySignal = Signal(str)  # 自定义信号, 参数是一个字符串

    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)
        self.init_ui()

    def init_ui(self):
        self.edit = QLineEdit(self)
        self.edit.move(10, 10)

        button = QPushButton('发送', self)
        button.move(10, 40)
        button.clicked.connect(self.send_edit_content)

        self.setWindowTitle('MyDialog')
        self.setGeometry(300, 300, 300, 200)

    def send_edit_content(self):
        content = self.edit.text()
        self.mySignal.emit(content)  # 发射信号


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.init_ui()

    def init_ui(self):
        self.button = QPushButton('open', self)
        self.button.clicked.connect(self.open_my_dialog)
        self.button.move(10, 10)

        self.label = QLabel("hello", self)
        self.label.move(10, 50)

        self.setWindowTitle('Window')
        self.setGeometry(300, 300, 300, 200)

        self.show()

    def open_my_dialog(self):
        my = MyDialog(self)
        # 在主窗口中连接信号和槽
        my.mySignal.connect(self.get_dialog_signal)
        my.exec()

    def get_dialog_signal(self, connect):
        self.label.setText(connect)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = Window()
    myWin.show()

    app.exec()

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5是一个强大的Python GUI框架,可以用于创建多窗口应用程序。同时,它也提供了多线程的支持,可以在应用程序同时执行多个任务。 对于多窗口应用程序,可以使用PyQt5的QMainWindow类创建主窗口,并使用其他QWidget类创建额外的窗口。主窗口是整个应用程序的主要界面,而窗口可以用于显示其他视图或执行其他任务。 使用多线程可以使应用程序具有更好的响应性能,特别是在处理复杂的或耗时的任务时。可以使用PyQt5QThread类创建线程,然后将任务分配给这些线程进行并行执行,以避免主线程被阻塞。 在多窗口应用程序使用多线程时,需要注意以下几点。首先,应该避免使用全局变量,而应该使用线程通信机制进行数据传递PyQt5提供了信号与槽机制和队列等线程通信的方式。 其次,需要注意线程安全性。多个线程共享相同的数据时,可能会引起数据竞争和不一致性。可以使用互斥锁等同步机制来保证数据的一致性。 此外,还需要注意界面的更新。在多线程进行的任务会影响到界面的显示,但需要注意将界面的更新操作放在主线程进行,以避免多个线程同时更新界面而导致的冲突。 总之,PyQt5提供了多窗口和多线程的支持,可以帮助我们创建功能强大的应用程序,提升用户体验和性能。但在使用过程,需要注意线程通信、线程安全性和界面更新等问题,以保证应用程序的稳定和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值