Как удалить дубликаты из QComboBox в pyqt4 python

#python #duplicates #pyqt4 #qcombobox

#python #дубликаты #pyqt4 #qcombobox

Вопрос:

Как удалить дубликаты из combobox в pyqt4. я попробовал следующий код, но он не удаляет дубликаты из ComboBox.

Код:

 from PyQt4 import QtCore, QtGui
import sys
app = QtGui.QApplication(sys.argv)
w = QtGui.QWidget()
w.resize(500, 388)

combo=QtGui.QComboBox(w)
combo.setGeometry(QtCore.QRect(150, 50, 251, 31))
combo.addItem("aa")
combo.addItem("bb")
combo.addItem("cc")
combo.addItem("aa")
combo.setDuplicatesEnabled(False)

w.setWindowTitle("PyQt")
w.show()
sys.exit(app.exec_())
  

Ответ №1:

Кажется, вы не читали документы:

Это свойство определяет, может ли пользователь вводить повторяющиеся элементы в поле со списком.

Обратите внимание, что всегда можно программно вставить повторяющиеся элементы в combobox.

По умолчанию это свойство равно false (дубликаты не допускаются).


изюминка моя

Таким образом, возможным решением является перезапись метода addItem для выполнения фильтрации:

 from PyQt4 import QtCore, QtGui
import sys


class ComboBox(QtGui.QComboBox):
    def addItem(self, item):
        if item not in self.get_set_items():
            super(ComboBox, self).addItem(item)

    def addItems(self, items):
        items = list(self.get_set_items() | set(items))
        super(ComboBox, self).addItems(items)

    def get_set_items(self):
        return set([self.itemText(i) for i in range(self.count())])


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = QtGui.QWidget()
    w.resize(500, 388)

    combo = ComboBox(w)
    combo.setGeometry(QtCore.QRect(150, 50, 251, 31))
    combo.addItems(["aaa", "bb", "aaa"])
    combo.addItem("aa")
    combo.addItem("bb")
    combo.addItem("cc")
    combo.addItem("aa")
    w.setWindowTitle("PyQt")
    w.show()
    sys.exit(app.exec_())
  

Ответ №2:

Из документации qt:

Обратите внимание, что всегда можно программно вставить повторяющиеся элементы в combobox.

Вам нужно вручную избегать дубликатов. Вы могли бы создать a set из всех элементов, а затем передать его элементы addItem .