【问题标题】:PyQt Enable/Disable elements in a QComboBoxPyQt 启用/禁用 QComboBox 中的元素
【发布时间】:2015-07-10 08:24:21
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x pyqt pyqt4 qcombobox


    【解决方案1】:

    注意:上面的 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 就是这样!谢谢
      猜你喜欢
      • 2013-12-26
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2016-07-03
      • 2011-02-10
      • 2011-08-20
      • 1970-01-01
      相关资源
      最近更新 更多