2015-04-30 1 views
3

J'ai un QComboBox qui liste toutes les lettres de lecteur de Windows et laisse l'utilisateur choisir parmi eux. Pendant l'exécution, nous devons activer ou désactiver certaines lettres (sans les supprimer).PyQt Activer/Désactiver des éléments dans un QComboBox

Voici le code de base:

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) 

je pouvais trouver une sorte de solution (qui semble vraiment compliqué) pour seulement désactiver une entrée here mais aucun moyen de lui permettre de retour.

Quel serait le meilleur moyen d'activer et de désactiver toute entrée d'un QComboBox?

Répondre

5

Par défaut, QComboBox utilise un QStandardItemModel, de sorte que toutes les méthodes pratiques de QStandardItem sont à votre disposition:

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

C'est le chemin! Merci – samb

1

Note: La réponse de ekhumoro ci-dessus est probablement tout ce dont vous avez besoin! Ne cherchez pas plus loin, à moins d'avoir une raison de vouloir utiliser un QAbstractItemModel au lieu d'un QStandardItemModel.

Note 2: Ceci n'est en aucun cas un modèle de liste d'usage général. Il était uniquement destiné à être utilisé pour un QComboBox spécifique dans l'une de mes applications. On devrait le modifier pour les fins prévues.

... de toute façon, j'ai résolu ce problème en sous-classant QAbstractListModel, puis en appelant QComboBox.setModel (mylistmodel). Mon ListModel ressemble à ceci:

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