PyQt Enable / Disable Items in QComboBox

I have a QComboBox that lists all Windows drive letters and lets you choose among them. At runtime, we need to enable or disable some letters (without removing them).

Here's the basic code:

all_letters = ["{}:".format(chr(i)) for i in range(90, 64, -1)]  # Z: -> A:
all_letters.insert(0, "")
cb_letter = QtGui.QComboBox()
for l in all_letters:
    cb_letter.addItem(l)
cb_letter.setCurrentIndex(0)

      

I could find some solution (which sounds very complicated) by simply disabling recording here , but was unable to enable it.

What would be the best way to enable or disable any QComboBox entry?

+3


source to share


2 answers


By default it QComboBox

uses QStandardItemModel

, so all convenience methods QStandardItem

are available:



cb_letter.model().item(2).setEnabled(False)

      

+5


source


Note: ekhumoro's answer above is probably all you need! Look no further unless you have reason to want to use QAbstractItemModel instead of QStandardItemModel.

Note 2: This is by no means a universal list model. It only intended for a specific QComboBox in one of my applications. It should be modified as intended.



... Anyway, I solved this problem by subclassing QAbstractListModel and then calling QComboBox.setModel (mylistmodel). My ListModel looks like this:

from PySide import QtCore

class ListModel(QtCore.QAbstractListModel):
    """
    Class for list management with a QAbstractListModel.
    Implements required virtual methods rowCount() and data().
    Resizeable ListModels must implement insertRows(), removeRows().
    If a nicely labeled header is desired, implement headerData().
    """

    def __init__(self,input_list=[],parent=None):
        super(ListModel,self).__init__(parent)
        self.list_data = []
        self.enabled = []
        for thing in input_list:
            self.append_item(thing)

    def append_item(self,thing):
        ins_row = self.rowCount()
        self.beginInsertRows(QtCore.QModelIndex(),ins_row,ins_row+1)
        self.list_data.append(thing)
        self.enabled.append(True)
        self.endInsertRows()

    def remove_item(self,idx):
        del_row = idx.row()
        self.beginRemoveRows(QtCore.QModelIndex(),del_row,del_row)
        self.list_data.pop(del_row)
        self.enabled.pop(del_row)
        self.endRemoveRows()

    def set_disabled(self,row):
        self.enabled[row] = False

    def flags(self,idx):
        if self.enabled[idx.row()]:
            return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
        else:
            return QtCore.Qt.NoItemFlags

    def rowCount(self,parent=QtCore.QModelIndex()):
        return len(self.list_data)

    def data(self,idx,data_role):
        return self.list_data[idx.row()]

    def insertRows(self,row,count):
        self.beginInsertRows(QtCore.QModelIndex(),row,row+count-1)
        for j in range(row,row+count):
            self.list_data.insert(j,None)
        self.endInsertRows()

    def removeRows(self, row, count, parent=QtCore.QModelIndex()):
        self.beginRemoveRows(parent,row,row+count-1)
        for j in range(row,row+count)[::-1]:
            self.list_items.pop(j)
        self.endRemoveRows()

    def headerData(self,section,orientation,data_role):
        return None

      

+1


source







All Articles