python - example - pyqt combobox get value
PyQt Habilitar/Deshabilitar elementos en un QComboBox (2)
De forma predeterminada, QComboBox
utiliza un QStandardItemModel
, por lo que todos los métodos de conveniencia de QStandardItem
están disponibles para usted:
cb_letter.model().item(2).setEnabled(False)
Tengo un QComboBox que enumera todas las letras de unidad de Windows y deja que el usuario elija entre ellas. Durante la ejecución, debemos habilitar o deshabilitar algunas de las letras (sin eliminarlas).
Aquí está el código básico:
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)
Pude encontrar una especie de solución (que suena realmente complicada) para deshabilitar una entrada aquí pero no hay forma de volverla a habilitar.
¿Cuál sería la mejor manera de habilitar y deshabilitar cualquier entrada de un QComboBox?
Nota: ¡la respuesta de ekhumoro anterior es probablemente todo lo que necesitas! No busque más, a menos que tenga un motivo para querer utilizar un QAbstractItemModel en lugar de un QStandardItemModel.
Nota 2: Esto de ninguna manera es un modelo de lista de propósito general. Solo estaba destinado a ser utilizado para un QComboBox específico en una de mis aplicaciones. Uno debe modificarlo para sus fines previstos.
... de todos modos, resolví este problema subclasificando QAbstractListModel y luego llamando a QComboBox.setModel (mylistmodel). Mi ListModel se ve así:
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