example python python-3.x pyqt pyqt4 qcombobox

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