web-dev-qa-db-fra.com

Comment ajouter des éléments à une zone de liste déroulante dans PyQt

J'ai besoin d'aide pour ajouter des éléments à un QComboBox. J'ai donc deux zones de liste déroulante, et l'une remplit l'autre en fonction de l'élément sélectionné.

Ma question est que, en utilisant additem pour les nouveaux éléments, cela fonctionne, mais si je choisis une autre option pour la zone de liste déroulante, il ajoute les nouveaux éléments, mais les éléments précédents ont disparu - et il y a des éléments vides sous le nouveau ceux.

Je pensais qu'à chaque fois que je choisissais une nouvelle option dans la première combobox pour effacer le contenu de la deuxième combobox. J'ai donc utilisé la clear() sur la seconde - mais cela n'a pas fonctionné.

Voilà comment j'en ai pensé:

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

Ce qui précède fait partie d'une fonction qui s'exécute lorsque le premier combobox change.

23
GiannisIordanou

En supposant que list1 Est une liste de chaînes, vous pouvez simplement les ajouter toutes à la fois en utilisant la méthode addItems :

self.comboBox_2.clear()
self.comboBox_2.addItems(list1)

Notez que vous utilisez probablement QApplication.translate Dans le mauvais sens dans votre exemple. Si vous souhaitez que les chaînes de list1 Soient traduites dans une langue différente, vous devez le faire lorsque vous créez la liste, et utilisez chaînes littéraux.

Par exemple:

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

Notez également que la fonction _fromUtf8 N'est vraiment utile que si vous utilisez des littéraux de chaîne contenant des caractères non ascii dans votre code - sinon, il s'agit essentiellement d'un no-op.

[~ # ~] modifier [~ # ~]

Si votre liste contient, disons, des tuples de pixmaps et de texte, vous pouvez utiliser quelque chose comme ceci:

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

Il y a des démos/exemples simples et faciles à lire ici https://github.com/shuge/Enjoy-Qt-Python-Binding ,

clonez-le et vous trouverez une démo sur la façon d'utiliser la base QComboBox et de personnaliser son icône.

4
Tony

J'ai dû remplir la comboBox en utilisant les noms d'un fichier texte

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

J'espère que cela aidera quelqu'un à l'avenir.

.

0
Mujeeb Ishaque