Python 如何将对话框中的信号发送到主窗口中的插槽

Python 如何将对话框中的信号发送到主窗口中的插槽,python,pyqt5,Python,Pyqt5,我一直在努力学习信号和插槽,因为它似乎是PyQT中类之间通信的正确方式 下面你会找到我的代码,让我和你一起浏览代码,你会更好地理解我的问题 我有一个带按钮的主窗口 单击按钮时,将执行一个对话框窗口 用户在textLineEdits中输入一些数据,然后单击“添加”按钮 数据被转储到Json文件中 这是我停下来的地方: 当我的数据写入Json文件时,我想发出一个带有2个字符串作为参数的信号 将信号与MainWindow类中的函数连接,以便将项目添加到我的组合框(组合框位于MainWindow中)

我一直在努力学习信号和插槽,因为它似乎是PyQT中类之间通信的正确方式

下面你会找到我的代码,让我和你一起浏览代码,你会更好地理解我的问题

  • 我有一个带按钮的主窗口
  • 单击按钮时,将执行一个对话框窗口
  • 用户在textLineEdits中输入一些数据,然后单击“添加”按钮
  • 数据被转储到Json文件中
  • 这是我停下来的地方:

    • 当我的数据写入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
    之前)