两个不同class调用彼此变量,关键在Signal、emit与connect槽函数应用。
MainWinGUI.py
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtWidgets import *
import sys
from Ui_MainWindow import Ui_MainWindow
from ChildWinGUI import ChildForm
class MainForm(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainForm, self).__init__() #ChildForm
self.setupUi(self) # 函数定义来自MainWinGUI.py
# 这里的ChildForm()是我们创建子窗口类
# 我们将其命名为OurNewWindow
self.OurNewWindow = ChildForm() # 子窗口实例化
# 调用子窗口,并向子窗口传递参数
# 方法 1
self.SendButton_1.clicked.connect(self.CallChildWin)
self.SendButton_2.clicked.connect(self.CallChildWin)
def CallChildWin(self):
#初始化子窗口
# self.OurNewWindow.init_Ui()
# 显示子窗口
self.OurNewWindow.show()
# 连接信号
self.OurNewWindow.param_signal.connect(self.display_params)
# 使用sender()获取当前按键名称判断是 Send1 还是 Send2
if self.sender().text() == 'Send1': # name is bn name
self.OurNewWindow.btn_num = 1
else:
self.OurNewWindow.btn_num = 2
# # 方法 2,使用lambda传递自定义参数
# self.SendButton_1.clicked.connect(lambda: self.CallChildWin(1))
# self.SendButton_2.clicked.connect(lambda: self.CallChildWin(2))
# def CallChildWin(self, num):
# # 初始化子窗口
# # self.OurNewWindow.init_Ui()
# # 显示子窗口
# self.OurNewWindow.show()
# # 连接信号
# self.OurNewWindow.param_signal.connect(self.display_params)
# # 根据传入的实参来赋值btn_num
# if num == 1:
# self.OurNewWindow.btn_num = 1
# else:
# self.OurNewWindow.btn_num = 2
def display_params(self, arg1, arg2, arg3, arg4):
# 显示
self.textBrowser.setText("This is sent from \"Send%d\"" % arg4)
self.textBrowser.append("The shape is: %s" % arg1)
self.textBrowser.append("Length = : %d" % arg2)
self.textBrowser.append("Width = : %f" % arg3)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainForm()
win.show()
sys.exit(app.exec())
ChildWinGUI.py
from PySide6 import QtWidgets, QtCore, QtGui
from PySide6.QtCore import Signal
from PySide6.QtWidgets import *
import sys
from Ui_ChildWindow import Ui_Child_MainWindow
class ChildForm(QMainWindow, Ui_Child_MainWindow):
# 定义信号
param_signal = Signal(str, int, float, int) # 分别对应shape Length Width num
def __init__(self):
super(ChildForm, self).__init__()
# self.setupChildUi(self) # 函数定义来自ChildWinGUI.py
self.setupUi(self) # 函数定义来自MainWinGUI.py
self.retranslateUi(self) # 函数定义来自ChildWinGUI.py
# 定义按键序号
self.btn_num = 0
# 绑定信号和槽
self.Save_button.clicked.connect(self.save_func)
def save_func(self):
in_type = self.lineEdit_rec.text() # 读取shape输入
in_length = int(self.lineEdit_l.text()) # 读取length输入
in_width = float(self.lineEdit_w.text()) # 读取witdth输入
in_num = self.btn_num # 读取按键编号
# 发送信号
self.param_signal.emit(in_type, in_length, in_width, in_num)
# 保存后关闭子窗口
self.close()