4 votes

Ajout d'une option 'None' à une QComboBox liée à un modèle

J'ai une QComboBox pour que l'utilisateur puisse choisir un nom de réseau à partir d'une colonne du modèle. J'utilise un code comme celui-ci :

self.networkSelectionCombo = QtGui.QComboBox()
self.networkSelectionCombo.setModel(self.model.worldLinks)
self.networkSelectionCombo.setModelColumn(WLM.NET_NAME)

J'utilise PySide, mais c'est vraiment une question Qt. Les réponses utilisant C++ sont acceptables.

Je dois donner à l'utilisateur la possibilité de ne sélectionner aucun réseau. Ce que j'aimerais faire, c'est ajouter un élément supplémentaire à la liste déroulante, appelé "Aucun". Cependant, cet élément sera simplement remplacé par le contenu du modèle.

Le seul moyen auquel je pense est de créer une vue personnalisée intermédiaire sur cette colonne du modèle et de l'utiliser pour mettre à jour la combinaison, puis la vue peut gérer l'ajout de l'élément "magique" supplémentaire. Quelqu'un connaît-il une façon plus élégante de procéder ?

3voto

pnezis Points 6971

Une solution possible est de sous-classer le modèle que vous utilisez afin d'y ajouter l'élément supplémentaire. L'implémentation est simple. Si vous appelez votre modèle MyModel alors la sous-classe ressemblerait à ceci (C++ utilisé) :

class MyModelWithNoneEntry : public MyModel
{
public:
    int rowCount() {return MyModel::rowCount()+1;}
    int columnCount() {return MyModel::columnCOunt();}
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const
    {
        if (index.row() == 0)
        {
             // if we are at the desired column return the None item
             if (index.column() ==  NET_NAME && role == Qt::DisplayRole)
                  return QVariant("None");
             // otherwise a non valid QVariant
             else
                  return QVariant();
        }
        // Return the parent's data
        else
            return MyModel::data(createIndex(index.row()-1,index.col()), role);       
    } 

    // parent and index should be defined as well but their implementation is straight
    // forward
} 

Vous pouvez maintenant définir ce modèle pour la boîte combo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X