簡體   English   中英

如何將信號從 Dialog 發送到 MainWindow 中的插槽

[英]How to emit signal from Dialog to a slot in MainWindow

我一直在嘗試了解信號和插槽,因為它似乎是在 PyQT 中的類之間進行通信的正確方法。

你會在下面找到我的代碼,讓我和你一起瀏覽代碼,因為你會更好地理解我的問題。

  1. 我有一個帶按鈕的主窗口
  2. 單擊按鈕時,將執行一個對話窗口。
  3. 用戶在 textLineEdits 中輸入一些數據,然后單擊“添加”按鈕
  4. 數據被轉儲到一個 Json 文件

這就是我停下來的地方:

  • 當我的數據寫入我的 Json 文件時,我想發出一個帶有 2 個字符串作為參數的信號。

  • 將信號與 MainWindow 類中的函數連接,以便將項目添加到我的 Combobox(ComboBox 在 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()定義一個信號,將此信號連接到MainWindow.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()

MainWindow

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_()

    ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM