2017-12-17 4 views
0

Qt 디자이너 & Qt 디자이너에서 두 개의 GUI를 만들었습니다. 첫 번째 GUI는 사람 이름을 comboBox에 표시하는 것입니다. 두 번째 GUI는 + 버튼을 클릭하면 opend되며 사용자는 나중에 다른 이름으로 필요한 이름, 나이 및 직업을 쓸 수 있습니다.comboBox에 문자열을 다른 대화 상자에서 설정하십시오.

제 질문은, 2. GUI에서 새 이름을 얻고 GUI의 comboBox에 어떻게 설정할 수 있습니까? 아래 코드에서 시도했지만 작동하지 않습니다.

전체 코드 :

from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtWidgets import * 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName("MainWindow") 
     MainWindow.resize(363, 165) 
     self.centralwidget = QtWidgets.QWidget(MainWindow) 
     self.centralwidget.setObjectName("centralwidget") 
     self.label = QtWidgets.QLabel(self.centralwidget) 
     self.label.setGeometry(QtCore.QRect(30, 30, 68, 19)) 
     self.label.setObjectName("label") 
     self.comboBox = QtWidgets.QComboBox(self.centralwidget) 
     self.comboBox.setGeometry(QtCore.QRect(120, 30, 131, 25)) 
     self.comboBox.setObjectName("comboBox") 
     self.pushButton = QtWidgets.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(280, 30, 41, 34)) 
     self.pushButton.setObjectName("pushButton") 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtWidgets.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 363, 31)) 
     self.menubar.setObjectName("menubar") 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtWidgets.QStatusBar(MainWindow) 
     self.statusbar.setObjectName("statusbar") 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     _translate = QtCore.QCoreApplication.translate 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
     self.label.setText(_translate("MainWindow", "person")) 
     self.pushButton.setText(_translate("MainWindow", "+")) 

    def InputDialog1(self): 
     self.Dialog = QtWidgets.QDialog() 
     self.ui=Ui_Dialog() 
     self.ui.setupUi(self.Dialog) 
     self.Dialog.setWindowTitle('Add Infos') 
     self.Dialog.show() 

class Person_data(object): 
    def __init__(self,parent=None): 
     self.Person_1 = {'-':[0,0]} 

class MainWindow(QMainWindow, Ui_MainWindow,Person_data): 

    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent=parent) 
     Person_data.__init__(self, parent=parent) 
     self.setupUi(self) 
     self.initMe() 

    def initMe(self): 
     self.pushButton.clicked.connect(self.InputDialog1) 

     Person_list={} 
     for i in self.Person_1.keys(): 
       Person_list[i] = '' 
       Person_list_2 = list(Person_list) 
     print(Person_list_2) 
     self.comboBox.addItems(Person_list_2) 



class Ui_Dialog(Person_data): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName("Dialog") 
     Dialog.resize(344, 231) 
     self.pushButton = QtWidgets.QPushButton(Dialog) 
     self.pushButton.setGeometry(QtCore.QRect(170, 160, 112, 34)) 
     self.pushButton.setObjectName("pushButton") 
     self.pushButton_2 = QtWidgets.QPushButton(Dialog) 
     self.pushButton_2.setGeometry(QtCore.QRect(30, 160, 112, 34)) 
     self.pushButton_2.setObjectName("pushButton_2") 
     self.gridLayoutWidget = QtWidgets.QWidget(Dialog) 
     self.gridLayoutWidget.setGeometry(QtCore.QRect(30, 20, 271, 121)) 
     self.gridLayoutWidget.setObjectName("gridLayoutWidget") 
     self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) 
     self.gridLayout.setContentsMargins(0, 0, 0, 0) 
     self.gridLayout.setObjectName("gridLayout") 
     self.lineEdit_2 = QtWidgets.QLineEdit(self.gridLayoutWidget) 
     self.lineEdit_2.setObjectName("lineEdit_2") 
     self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1) 
     self.lineEdit = QtWidgets.QLineEdit(self.gridLayoutWidget) 
     self.lineEdit.setObjectName("lineEdit") 
     self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1) 
     self.lineEdit_3 = QtWidgets.QLineEdit(self.gridLayoutWidget) 
     self.lineEdit_3.setObjectName("lineEdit_3") 
     self.gridLayout.addWidget(self.lineEdit_3, 2, 1, 1, 1) 
     self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget) 
     self.label_2.setObjectName("label_2") 
     self.gridLayout.addWidget(self.label_2, 2, 0, 1, 1) 
     self.label_3 = QtWidgets.QLabel(self.gridLayoutWidget) 
     self.label_3.setObjectName("label_3") 
     self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1) 
     self.label = QtWidgets.QLabel(self.gridLayoutWidget) 
     self.label.setObjectName("label") 
     self.gridLayout.addWidget(self.label, 0, 0, 1, 1) 

     self.retranslateUi(Dialog) 
     QtCore.QMetaObject.connectSlotsByName(Dialog) 
     self.pushButton.clicked.connect(self.okpress) 
     self.pushButton_2.clicked.connect(Dialog.close) 

    def okpress(self): 
     aa1=float(self.lineEdit_2.text());aa2=float(self.lineEdit_3.text()) 
     self.Person_1[str(self.lineEdit.text())] = [aa1,aa2] 
     i = True 
     while i == True: 
      bb = MainWindow() 
      Person_list={} 
      for i in self.Person_1.keys(): 
       Person_list[i] = '' 
       Person_list_2 = list(Person_list) 
      print(Person_list_2) 
      bb.comboBox.addItems(Person_list_2) 
      i=False #just to exit while 


    def retranslateUi(self, Dialog): 
     _translate = QtCore.QCoreApplication.translate 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog")) 
     self.pushButton.setText(_translate("Dialog", "add")) 
     self.pushButton_2.setText(_translate("Dialog", "Cancel")) 
     self.label_2.setText(_translate("Dialog", "Age")) 
     self.label_3.setText(_translate("Dialog", "Job")) 
     self.label.setText(_translate("Dialog", "Name")) 

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    w = MainWindow() 
    w.setWindowTitle('Main Person Windows') 
    w.show() 
    sys.exit(app.exec_()) 

답변

0

당신이 예기치 않은 동작을 할 수 있기 때문에 코드를 엉망으로뿐만 아니라, Qt는 디자이너에 의해 생성 된 코드를 수정하지 않는 것이 좋습니다. 내 관점에서 적절한 것은 해당 위젯을 상속하고 QtDesigner의 디자인을 사용하는 클래스를 만드는 것입니다. 따라서 제 대답에는 코드를보다 쉽게 ​​읽을 수 있도록 구조 조정이 포함됩니다.

코드에서 분석하면 상속을 데이터 공유의 개념과 혼동한다는 것을 알 수 있습니다. 클래스에서 상속 될 때 클래스의 각 객체가 비슷한 객체를 만들지 만 비슷하지만 유사하지 않은 요소를 각 클래스에 생성합니다 그 (것)들의 사이에서 동일하지 않다, 동일한 가변이다 그래서 당신이 다른 기억 공간을 가르키는 경우에, 당신은 Ui_Dialog와 MainWindow가 Person_data에서 상속하는 때, 두 종류 전부에있는 변수 Person_1가 동일 하, 실제로다는 것을 당신은 생각한다 그렇지 않습니다.

코드에있는 또 다른 문제는 유효성 검사입니다. 사용자가 적절한 값을 입력하고 필요한 경우 특정 요소와 상호 작용해야합니다. 예를 들어 텍스트가 비어 있거나 문자가 아닌 경우 부동 소수점으로 변환하면 문제가 발생할 수 있습니다. 또한 Qt는 QIntValidator와 같은 클래스를 제공하기 때문에 모든 필드가 올바르게 채워지면 추가 버튼을 사용해야합니다.

QDialog는 양식 전문 클래스이며 exec_()을 사용할 수 있도록 노력해야합니다. 양식이 수락되면 반환되기 때문에이 경우 버튼이 적절할 때 accept 및 reject 메서드를 사용해야합니다.

코드 : 많이 유익한 답변 및주의 사항에 대한

class PersonDialog(QtWidgets.QDialog, Ui_Dialog): 
    def __init__(self, *args, **kwargs): 
     QtWidgets.QDialog.__init__(self, *args, **kwargs) 
     self.setupUi(self) 
     self.pushButton.clicked.connect(self.accept) 
     self.pushButton_2.clicked.connect(self.reject) 
     self.lineEdit_3.setValidator(QtGui.QIntValidator(0, 100)) 
     self.lineEdit.textChanged.connect(self.enableButtonAccept) 
     self.lineEdit_2.textChanged.connect(self.enableButtonAccept) 
     self.lineEdit_3.textChanged.connect(self.enableButtonAccept) 
     self.enableButtonAccept() 

    def enableButtonAccept(self): 
     if self.lineEdit.text() != "" and self.lineEdit_2.text() != "" and self.lineEdit_3.text() != "": 
      self.pushButton.setEnabled(True) 
     else: 
      self.pushButton.setEnabled(False) 

    def getPerson(self): 
     values = self.lineEdit.text(), self.lineEdit_2.text(), int(self.lineEdit_3.text()) 
     self.lineEdit.clear() 
     self.lineEdit_2.clear() 
     self.lineEdit_3.clear() 
     return values 

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, *args, **kwargs): 
     QtWidgets.QMainWindow.__init__(self, *args, **kwargs) 
     self.setupUi(self) 
     self.Person_1 = {} 
     self.initMe() 

    def initMe(self): 
     self.personDialog = PersonDialog(self) 
     self.pushButton.clicked.connect(self.InputDialog1) 

    def InputDialog1(self): 
     if self.personDialog.exec_() == PersonDialog.Accepted: 
      name, job, edad = self.personDialog.getPerson() 
      self.Person_1[name] = [job, edad] 
      self.comboBox.addItem(name) 
+0

감사합니다. 나는 파이썬으로 올바른 방식으로 코딩하는 법을 배우는 중이고 조언은 정말 도움이된다. – Ahmad

+0

나는 질문이있다 : .__ init __ (self, * args, ** kwargs) 같은 .__ init __ (self, parent = parent) ?? – Ahmad

관련 문제