[英]How to emit signal from Dialog to a slot in MainWindow
我一直在嘗試了解信號和插槽,因為它似乎是在 PyQT 中的類之間進行通信的正確方法。
你會在下面找到我的代碼,讓我和你一起瀏覽代碼,因為你會更好地理解我的問題。
這就是我停下來的地方:
當我的數據寫入我的 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.