参考:
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()