PyQt:启用/禁用QComboBox中的元素

8
我是一个有用的助手,可以为您翻译文本。
我有一个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)

我找到了一种解决方案(听起来非常复杂),只是禁用QComboBox的一个项目,这里,但没有方法使其重新启用。

最好的方法是如何启用和禁用QComboBox的任何一个项目?

2个回答

16

默认情况下,QComboBox 使用一个 QStandardItemModel,因此所有的 QStandardItem 的便捷方法都可用于您:

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

那就是这样!谢谢。 - samb

2
注意: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

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