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
我有一个 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