2017-12-04 35 views
0

동적으로 생성 된 콤보 상자에 항목을 추가하려고합니다. 변수가 스스로 재정의하고 원하는 결과를 얻을 수 없다는 것을 알고 있습니다. 콤보 박스 (Combobox) 액션은 원하지 않는 마지막 항목에 항목을 추가합니다. 다음 항목을 오른쪽에 추가해야합니다.Pyqt에서 동적으로 생성 된 QComboboxes에 항목을 추가하는 방법

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 
i = 1 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(620, 500) 

     #LAYOUT SETTINGS 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget) 
     self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 
     self.gridLayout = QtGui.QGridLayout() 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 

     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setMinimumSize(QtCore.QSize(30, 30)) 
     self.pushButton.setMaximumSize(QtCore.QSize(30, 30)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1) 

     self.pushButton.clicked.connect(self.addNewCombobox) 
     self.pushButton.clicked.connect(self.addNewSCombobox) 
     self.pushButton.clicked.connect(self.addNewButton) 

     self.comboBox = QtGui.QComboBox(self.centralwidget) 
     self.comboBox.setMinimumSize(QtCore.QSize(0, 30)) 
     self.comboBox.setMaximumSize(QtCore.QSize(16777215, 30)) 
     self.comboBox.setObjectName(_fromUtf8("comboBox")) 
     self.comboBox.addItem(_fromUtf8("")) 
     self.gridLayout.addWidget(self.comboBox, 0, 1, 1, 1) 

     self.scomboBox = QtGui.QComboBox(self.centralwidget) 
     self.scomboBox.setMinimumSize(QtCore.QSize(0, 30)) 
     self.scomboBox.setMaximumSize(QtCore.QSize(16777215, 30)) 
     self.scomboBox.setObjectName(_fromUtf8("ScomboBox")) 
     self.gridLayout.addWidget(self.scomboBox, 0, 2, 1, 1) 

     spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) 
     self.gridLayout.addItem(spacerItem, 9999, 0, 1, 1) 
     self.verticalLayout.addLayout(self.gridLayout) 
     MainWindow.setCentralWidget(self.centralwidget) 

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

    def addNewButton(self): 
     print "Added" 
     global i 
     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setMinimumSize(QtCore.QSize(30, 30)) 
     self.pushButton.setMaximumSize(QtCore.QSize(30, 30)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     self.pushButton.setText("-") 
     self.gridLayout.addWidget(self.pushButton, i, 0, 1, 1) 
     self.pushButton.clicked.connect(self.comboBox.deleteLater) 
     self.pushButton.clicked.connect(self.scomboBox.deleteLater) 
     self.pushButton.clicked.connect(self.pushButton.deleteLater) 
     i += 1 

    def addNewCombobox(self): 
     self.comboBox = QtGui.QComboBox(self.centralwidget) 
     self.comboBox.setMinimumSize(QtCore.QSize(0, 30)) 
     self.comboBox.setMaximumSize(QtCore.QSize(16777215, 30)) 
     self.comboBox.addItem("foo") 
     self.comboBox.addItem("bar") 
     self.comboBox.setObjectName(_fromUtf8("comboBox_" + str(i))) 
     self.gridLayout.addWidget(self.comboBox, i, 1, 1, 1) 
     self.comboBox.activated[str].connect(self.addItem) 

    def addNewSCombobox(self): 
     self.scomboBox = QtGui.QComboBox(self.centralwidget) 
     self.scomboBox.setMinimumSize(QtCore.QSize(0, 30)) 
     self.scomboBox.setMaximumSize(QtCore.QSize(16777215, 30)) 
     self.scomboBox.setObjectName(_fromUtf8("ScomboBox_" + str(i))) 
     self.gridLayout.addWidget(self.scomboBox, i, 2, 1, 1) 

    def addItem(self, activetext): 
     # sendin = self.centralwidget.sender() 
     self.scomboBox.addItem(activetext) 


    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.comboBox.setItemText(0, _translate("MainWindow", "New Item", None)) 
     self.pushButton.setText(_translate("MainWindow", "+", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

여기 내가 약간의 변경이 필요하다고 생각합니다. 나는 objectnames 설정을 시도하고 어떻게 든 comboboxes를 연결하지만 나는하지 않았다.

def addItem(self, activetext): 
    # sendin = self.centralwidget.sender() 
    self.scomboBox.addItem(activetext) 

답변

0

나는이 문제를 해결한다. ObjectName과 findChild의 사용을 발견하고 몇 가지 변경을했습니다.

여기가 해결책입니다.

def addItem(self, text): 
    sendin = self.centralwidget.sender() 
    objname = str(sendin.objectName()) 
    objnamevalue = objname.split('_')[1] 
    self.centralwidget.findChild(QtGui.QComboBox, 'ScomboBox_' + objnamevalue).addItem(text)