Python 如何将对话框中的信号发送到主窗口中的插槽
我一直在努力学习信号和插槽,因为它似乎是PyQT中类之间通信的正确方式 下面你会找到我的代码,让我和你一起浏览代码,你会更好地理解我的问题Python 如何将对话框中的信号发送到主窗口中的插槽,python,pyqt5,Python,Pyqt5,我一直在努力学习信号和插槽,因为它似乎是PyQT中类之间通信的正确方式 下面你会找到我的代码,让我和你一起浏览代码,你会更好地理解我的问题 我有一个带按钮的主窗口 单击按钮时,将执行一个对话框窗口 用户在textLineEdits中输入一些数据,然后单击“添加”按钮 数据被转储到Json文件中 这是我停下来的地方: 当我的数据写入Json文件时,我想发出一个带有2个字符串作为参数的信号 将信号与MainWindow类中的函数连接,以便将项目添加到我的组合框(组合框位于MainWindow中)
- 当我的数据写入Json文件时,我想发出一个带有2个字符串作为参数的信号
- 将信号与MainWindow类中的函数连接,以便将项目添加到我的组合框(组合框位于MainWindow中)
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import ui.mainwindow as MnWindow
import ui.AddUserDialog as AddUserDialog
class MainWindow(QMainWindow,MnWindow.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButtonAddUser.clicked.connect(self.showDialog)
def showDialog(self):
d = AddUserDialog(self)
d.exec_()
#Catch the emited signal from AddUserDialog and connect it to AddToCombo function
def AddToCombo(self,first,last):
self.UserComboBox.addItem(first + ' ' + last)
class AddUserDialog(QDialog,AddUserDialog.Ui_Dialog):
def __init__(self,parent=None):
super(AddUserDialog,self).__init__(parent)
self.setupUi(self)
self.pushButtonAddUser.clicked.connect(self.AddUser)
def AddUser(self):
new_user = {
'firstname' : self.lineEditPrenom.text(),
'lastname' : self.lineEditNom.text(),
'Adresse' : self.lineEditAdresse.text(),
'Town' : self.lineEditVille.text(),
'ZipCode' : self.lineEditCodePostal.text(),
}
with open('MyJsonFile.json','r') as f:
data = json.load(f)
data['users'].append(new_user)
with open('MyJsonFile.json','w') as f:
json.dump(data,f,indent=3)
#Emit signal with new_user['firstname'] & new_user['lastname'] as arguments
self.close()
if __name__ == "__main__":
app = QApplication(sys.argv)
form = MainWindow()
form.show()
app.exec_()
要实现您的目标,您需要做三件事:在
AddUserDialog()
中定义一个信号,将此信号连接到main window.showDialog()
中的相应插槽,并在AddUserDialog.AddUser()中发出此信号
考虑到这一点,AddUserDialog
变得像
class AddUserDialog(QDialog):
# define a signal that emits two strings
user_added = QtCore.pyqtSignal(str, str)
...
def AddUser(self):
...
# emit signal
self.user_added.emit(new_user['firstname'], new_user['lastname'])
self.close()
和主窗口
:
class MainWindow(QMainWindow,MnWindow.Ui_MainWindow):
....
def showDialog(self):
d = AddUserDialog(self)
# connect signal to appropriate slot
d.user_added.connect(self.AddToCombo)
d.exec_()
....
请提供@S.Nick Hi Nick,谢谢您的评论。这是我的代码的最低版本,我从头开始,只留下与我的问题相关的部分。希望它不是详尽无遗的,因为我不知道怎样才能让它更简约。关于,@Hamouza请改进您的缩进,在python中非常重要。您忘记发布模块mainwindow.py
和AddUserDialog.py
,我使用Qt Designer创建GUI,因此我不太关注这两个文件,因为我只是导入它们,从不编辑它们。那么这些文件仍然与问题有关吗?谢谢,谢谢你的评论,我很清楚这个过程是如何运作的。尽管如此,我还是按照你的建议做了。乍一看,我有一个错误:AttributeError:'AddUserDialog'对象没有属性'user\u added'
我将user\u added改为self.user\u added,它给了我这个错误:AttributeError:'PyQt5.QtCore.pyqtSignal'对象没有属性'connect'
我不知道我在这里搞砸了什么。再次感谢听起来你没有正确定义信号。在AddUserDialog
中添加的user\u的定义应该在任何方法之外(例如,在class AddUserDialog(…):
之后和def\uuuu init\uuuu
之前)