我正在使用PyQt在Qt Designer上设计这个东西。所以我有一个QMainWindow
,用户可以从那里打开QDialog
来输入我保存在Json文件中的一些数据(下面的AddUser函数(
我想要的是,当单击AddUser按钮时,从AddUser函数中,如何在MainWindow类中定义的组合框中添加新项目?
这是两类的代码
import ui.mainwindow as MnWindow
import ui.AddUserDialog as AddUserDialog
#First GUI
class MainWindow(QMainWindow,MnWindow.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
#Second GUI
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):
DateDeNaissance = self.dateEditDateDeNaissance.date().toString(Qt.ISODate)
DateDeSortie = self.dateEditDateDeSortie.date().toString(Qt.ISODate)
new_user = {
'firstname' : self.lineEditPrenom.text(),
'lastname' : self.lineEditNom.text(),
'DateDeNaissance' : DateDeNaissance[-2:] + DateDeNaissance[5:7] + DateDeNaissance[:4],
'LieuDeNaissance' : self.lineEditLieuNaissance.text(),
'Adresse' : self.lineEditAdresse.text(),
'Ville' : self.lineEditVille.text(),
'CodePostal' : self.lineEditCodePostal.text(),
'DateDeSortie' : DateDeSortie[-2:] + DateDeSortie[5:7] + DateDeSortie[:4],
'Heure' : str(self.timeEditSortie.time().hour()),
}
with open('TestJson.json','r') as f:
data = json.load(f)
data['users'].append(new_user)
with open('TestJson.json','w') as f:
json.dump(data,f,indent=3)
MainWindow.UserComboBox.addItem(new_user['firstname'] + ' ' + new_user['lastname'])
最后一行当然是不正确的,我怎样才能正确地做到这一点?
附言:我读到我需要从MainWindow类继承,但我一直在尝试,但没有成功。
有两种可能的方法。
最简单的方法是从对实例的引用访问属性(或小部件的属性(。
class MainWindow(QMainWindow,MnWindow.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.someButton.clicked.connect(self.addUser)
def addUser(self):
dialog = AddUserDialog(self)
if dialog.exec_():
firstname = dialog.lineEditPrenom.text()
lastname = dialog.lineEditNom.text()
self.UserComboBox.addItem('{} {}'.format(firstname, lastname))
或者,如果对话框被接受,您可以覆盖对话框的exec_()
方法并返回值:
class MainWindow(QMainWindow,MnWindow.Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.addUserButton.clicked.connect(self.addUser)
def addUser(self):
res = AddUserDialog(self).exec_()
if res:
self.UserComboBox.addItem(res)
class AddUserDialog(QDialog,AddUserDialog.Ui_Dialog):
def exec_(self):
if super().exec_():
firstname = self.lineEditPrenom.text()
lastname = self.lineEditNom.text()
return '{} {}'.format(firstname, lastname)
两种解决方案都是在用户接受对话框的假设下工作的;好的";按钮如果要使用自定义按钮,还应该在AddUser()
函数末尾调用self.accept()
。
考虑一下Qt为此提供了QDialogButtonBox,并且您不需要添加自己的按钮。我相信你可能正在使用QPushButton,因为QDialogButtonBox的默认按钮都有固定的标签,并且没有一个具有";添加";文本,但这些按钮可以根据需要重命名。假设您的对话框上有一个名为buttonBox
的QDialogButtonBox(带有按钮的对话框的默认值(;好的";按钮,可以直接在accept()
函数中实现json编写:
class AddUserDialog(QDialog,AddUserDialog.Ui_Dialog):
def __init__(self,parent=None):
super(AddUserDialog,self).__init__(parent)
self.setupUi(self)
self.buttonBox.button(self.buttonBox.Ok).setText('Add user')
defaccept(self):
DateDeNaissance = self.dateEditDateDeNaissance.date().toString(Qt.ISODate)
DateDeSortie = self.dateEditDateDeSortie.date().toString(Qt.ISODate)
new_user = {
'firstname' : self.lineEditPrenom.text(),
'lastname' : self.lineEditNom.text(),
'DateDeNaissance' : DateDeNaissance[-2:] + DateDeNaissance[5:7] + DateDeNaissance[:4],
'LieuDeNaissance' : self.lineEditLieuNaissance.text(),
'Adresse' : self.lineEditAdresse.text(),
'Ville' : self.lineEditVille.text(),
'CodePostal' : self.lineEditCodePostal.text(),
'DateDeSortie' : DateDeSortie[-2:] + DateDeSortie[5:7] + DateDeSortie[:4],
'Heure' : str(self.timeEditSortie.time().hour()),
}
with open('TestJson.json','r') as f:
data = json.load(f)
data['users'].append(new_user)
with open('TestJson.json','w') as f:
json.dump(data,f,indent=3)
super().accept()
请注意,Designer会自动将按钮框的accepted
和rejected
信号连接到对话框的相关accept
和reject
插槽。如果你不想重建整个GUI并添加一个按钮框,只需创建一个带有按钮的新对话框,并用ctrl将按钮框拖动到现有界面,但你必须手动重新创建连接;您可以使用Designer的信号/插槽编辑模式(编辑菜单->编辑信号/插槽,或F4(或在您的代码中执行此操作:
class AddUserDialog(QDialog,AddUserDialog.Ui_Dialog):
def __init__(self,parent=None):
super(AddUserDialog,self).__init__(parent)
self.setupUi(self)
self.buttonBox.button(self.buttonBox.Ok).setText('Add user')
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
# ...
创建AddUserDialog:实例时,可以将组合框作为参数传递
class AddUserDialog(QDialog,AddUserDialog.Ui_Dialog):
def __init__(self,parent=None, combobox= None):
super(AddUserDialog,self).__init__(parent)
self.setupUi(self)
self.combobox = combobox
在AddUser方法中,使用self.combobox
:
# MainWindow.UserComboBox.addItem(new_user['firstname'] + ' ' + new_user['lastname'])
self.combobox.addItem(new_user['firstname'] + ' ' + new_user['lastname'])
或者,在创建实例时,您已经知道对话框的父对象。我认为super(AddUserDialog,self).__init__(parent)
行将为对话框设置self.parent
。然后在AddUser方法中,使用以下语句:
self.parent.UserComboBox..addItem(new_user['firstname'] + ' ' + new_user['lastname'])