QComboBox 中的 PyQt 启用/禁用元素

PyQt Enable/Disable elements in a QComboBox

提问人:samb 提问时间:4/30/2015 最后编辑:Communitysamb 更新时间:11/24/2016 访问量:11052

问:

我有一个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的任何条目的最佳方法是什么?

蟒蛇 python-3.x pyqt pyqt4 qcombobox

评论


答:

16赞 ekhumoro 5/1/2015 #1

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

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

评论

0赞 samb 5/1/2015
就是这样!谢谢
2赞 lensonp 11/24/2016 #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