如何在PyQt/PySide中向QComboBox添加项目

30

我需要帮助向 QComboBox 添加一些项目。所以我有两个组合框,其中一个根据选择的项目填充另一个。

我的问题是,在使用 additem 添加新项时,它可以工作,但如果我选择组合框的另一个选项,它会添加新项,但之前的项就消失了 - 而且新项下面还有空白项。

我认为,每次我从第一个组合框中选择一个新选项时,应该清除第二个组合框的内容。因此,我在第二个组合框上使用了 clear() ,但没有起作用。

这是我的想法:

self.comboBox_2.clear()
for index,i in enumerate(list1):
  self.comboBox_2.addItem(_fromUtf8(""))
  self.comboBox_2.setItemText(index+2, QApplication.translate("Dialog", i, None, QApplication.UnicodeUTF8))

以上代码是一个函数的一部分,当第一个 combobox 改变时执行。

3个回答

54

假设list1是一个字符串列表,那么您可以使用addItems方法一次性将它们全部添加:

self.comboBox_2.clear()
self.comboBox_2.addItems(list1)
注意,在您的示例中,您可能正在错误地使用QApplication.translate。如果您希望将list1中的字符串翻译成其他语言,则应在创建列表时进行,同时使用字符串文字

例如:

list1 = [
    self.tr('First Item'),
    self.tr('Second Item'),
    self.tr('Third Item'),
    ]

需要注意的是,_fromUtf8函数只有在您的代码中使用包含非ASCII字符的字符串文字时才真正有用 - 否则,它基本上是一个无操作。

编辑

如果您的列表包含像像素图和文本之类的元组,则可以使用以下内容:

self.comboBox_2.clear()
for pixmap, text in list1:
    self.comboBox_2.addItem(QIcon(pixmap), text)

谢谢,它起作用了。我的for循环会工作,不管有没有其他方法?我打算为列表中的每个字符串放置一些图标,这就是我想到循环的原因。 - IordanouGiannis

4

0
我需要使用文本文件中的名称来填充comboBox。
以下是代码:
    names = self.classes_names()
    self.comboBox.addItems(names)

    def classes_names(self):
        coconames = CURRENT_DIR + os.sep + 'yolo-coco' + os.sep + 'coco.names'
        with open(coconames) as reader:
            return reader.readlines()

我希望它能帮助未来的某个人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接