QComboBox 中的 PyQt Enable/Disable 个元素

PyQt Enable/Disable elements in a QComboBox

我有一个 QComboBox,它列出了所有 Windows' 驱动器盘符并让用户在其中进行选择。 在执行过程中,我们需要启用或禁用一些字母(不删除它们)。

基本代码如下:

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)

我可以找到一种解决方案(听起来真的很复杂)来禁用条目 here 但无法重新启用它。

启用和禁用 QComboBox 的任何条目的最佳方法是什么?

默认情况下,QComboBox 使用一个 QStandardItemModel, so all of the convenience methods of QStandardItem 可供您使用:

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

注意:ekhumoro 上面的回答可能就是您所需要的!别再看了,除非您有理由想要使用 QAbstractItemModel 而不是 QStandardItemModel。

注2:这绝不是通用列表模型。它仅用于我的一个应用程序中的特定 QComboBox。人们应该根据他们的预期目的修改它。

...无论如何,我通过子类化 QAbstractListModel 然后调用 QComboBox.setModel(mylistmodel) 解决了这个问题。我的 ListModel 如下所示:

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