【问题标题】:How to add item to dynamically created QComboboxes in Pyqt如何在 Pyqt 中将项目添加到动态创建的 QComboboxes
【发布时间】:2017-12-04 16:58:28
【问题描述】:

我正在尝试将项目添加到动态创建的组合框中。 我知道我的变量会覆盖自己,我无法得到想要的结果。组合框操作将项目添加到我不想要的最后一个项目。它需要将项目添加到右下一个。

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

我想我需要在这里进行一些更改。我尝试设置对象名称并以某种方式连接组合框,但我没有。

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

【问题讨论】:

    标签: python dynamic overriding pyqt4 qcombobox


    【解决方案1】:

    我解决了这个问题。找到了 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多