利用Qtdesigner分别生成主窗口和子窗的ui文件。
主窗口的界面如下:
子窗口的界面:
生成的UI文件利用 pyuic5转换成py文件:命令为:pyuic5 ***.ui>***.py
单独编辑主调用程序,实现界面和逻辑文件的分离。
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem
from father import Ui_MainWindow
from child import Ui_Dialog
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.onClicked)
#一定要在主窗口类的初始化函数中对子窗口进行实例化,如果在其他函数中实例化子窗口
#可能会出现子窗口闪退的问题
self.ChildDialog = ChildWin()
def onClicked(self):
# print('打开子窗口!')
self.ChildDialog.show()
#连接信号
self.ChildDialog._signal.connect(self.getData)
def getData(self, parameter, parameter1):
# print('This is a test.')
#print(parameter)
self.lineEdit.setText(parameter)
self.lineEdit_2.setText(parameter1)
class ChildWin(QMainWindow, Ui_Dialog):
#定义信号
_signal = QtCore.pyqtSignal(str,str)
def __init__(self):
super(ChildWin, self).__init__()
self.setupUi(self)
self.retranslateUi(self)
self.pushButton.clicked.connect(self.slot1)
def slot1(self):
data_str = self.lineEdit.text()
data_str2= self.lineEdit_2.text()
#发送信号
self._signal.emit(data_str,data_str2)
self.lineEdit.setText("")
self.lineEdit_2.setText("")
self.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = MainWindow()
ChildWindow = ChildWin()
MainWindow.show()
sys.exit(app.exec_())
程序运行如下:在主界面点击“打开子窗口”,子窗口打开后,输入输入两个参数,点击子窗口的发射信号按钮,子窗口关闭。两个参数分别填写在主窗口的两个LineEdit文本框。
本文参考了https://blog.csdn.net/weixin_42818665/article/details/104246058,在主窗口和子窗口分别添加了两个文本框,然后实现子窗口点击之后,自动关闭。