IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

QComboBox avec QCheckBox

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut QComboBox avec QCheckBox
    Bonjour,

    Je travaille actuellement sur une application et j'ai besoin d'utiliser une ComboBox avec CheckBox.
    J'ai trouvé un code qui m'a beaucoup aidé, car j'avoue ne pas comprendre le principe des ItemDelegate...

    Seulement voila mon problème : J'initialise les cases (cochées ou non) en fonction de paramètres. Jusqu'ici, pas de problème. Seulement, lorsque je veux en modifier une, que ce soit pour la cocher ou la décocher, la premier fois, ce n'est pas enregistré (exemple : je viens de cocher une case, je survole la case d'à côté, et elle se décoche automatiquement). Lors du deuxième essai, cela fonctionne et je ne comprends pas pourquoi.

    Voici donc mon premier fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    class CheckComboBox : public QComboBox
    {
     
        public:
     
                CheckComboBox(QWidget *parent = 0, Parametres * pref=0) : QComboBox(parent)
                {
                    view()->setItemDelegate(new CheckComboBoxDelegate(this, pref));
                    view()->setEditTriggers(QAbstractItemView::CurrentChanged);
                    view()->viewport()->installEventFilter(this);
                }
     
        protected:
     
                bool eventFilter(QObject *obj, QEvent *ev)
                {
                    if (obj == view()->viewport() && ev->type() == QEvent::MouseButtonRelease)
                        return true;
     
                    return QComboBox::eventFilter(obj, ev);
                }
    };
     
    #endif
    et le second ou se fait le plus gros du traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
     
    class CheckComboBoxDelegate : public QStyledItemDelegate
    {
        public:
                CheckComboBoxDelegate(QObject *parent = 0, Parametres* pref=0) : QStyledItemDelegate(parent) {
                    this->parametres = parametres;
                }
     
                void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
     
                    bool value = index.data(Qt::UserRole).toBool();
                    const QString text = index.data(Qt::DisplayRole).toString();
                    const QStyleOptionViewItemV4 sov = static_cast<const QStyleOptionViewItemV4>(option);
     
                    const QStyle *style = sov.widget->style();
                    QStyleOptionButton opt;
     
                    if(text == case_x )
                        value = (/*Le paramètre est à true*/) ? true: false;
     
                    opt.state |= value ? QStyle::State_On : QStyle::State_Off;
                    opt.state |= QStyle::State_Enabled;
                    opt.text = text;
                    opt.rect = option.rect;
     
                    style->drawControl(QStyle::CE_CheckBox, &opt,painter);
     
                }
     
                QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
     
                    Q_UNUSED(option);
                    Q_UNUSED(index);
     
                    QCheckBox *checkBox = new QCheckBox(parent);
                    return checkBox;
                }
     
    	    // fonction appellée au survol d'une case
                void setEditorData(QWidget *editor, const QModelIndex &index) const {
     
                    QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
                    if (checkBox) {
                        QString text = index.data(Qt::DisplayRole).toString();
                        bool value = index.data(Qt::UserRole).toBool();
     
                    if(text == case_x )
                        value = (/*Le paramètre est à true*/) ? true: false;
     
                    checkBox->setText(text);
                    checkBox->setChecked(value);
                    }
                }
     
                void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
     
                    QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
                    if (checkBox) {
                        model->setData(index, checkBox->isChecked(), Qt::UserRole);
     
                    QString text = index.data(Qt::DisplayRole).toString();
     
     
                    if(text == case_x)
                        parametre = (checkBox->isChecked()) ? "1" : "0";
                    }
     
                    /*
                    QCheckBox *checkBox = qobject_cast<QCheckBox *>(editor);
                    if (checkBox) {
                        model->setData(index, checkBox->isChecked(), Qt::UserRole);
                        qDebug() << Q_FUNC_INFO;
                    }*/
     
                    //if(checkBox->isChecked())
                    //    std::cout << "case checked : " << index.data(0).toString().toStdString() << std::endl;
     
                }
     
                void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const {
                    Q_UNUSED(index);
                    editor->setGeometry(option.rect);
                }
     
        private :
                Parametres* parametres;
    }; 
     
    #endif
    j'espère que quelqu'un d'entre vous comprendra mon problème, en attendant, je vais essayer d'autres codes.

    Az

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    C'est cette ligne qui posait problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model->setData(index, checkBox->isChecked(), Qt::UserRole);
    dans la fonction setModelData. Je ne saurais trop dire pourquoi, si quelqu'un a un élément de réponse, je suis preneur.

    En tout cas, voilà, ce code fonctionne, donc si vous désirez une ComboBox avec CheckBox

    Az

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sélection Multiple avec un QComboBox QT Jambi
    Par kamalkane dans le forum Autres
    Réponses: 0
    Dernier message: 17/09/2013, 13h58
  2. Ouvrir un QDialog avec un QComboBox
    Par nadour dans le forum Débuter
    Réponses: 1
    Dernier message: 08/07/2013, 14h25
  3. Problème avec QComboBox, layout et changement de map
    Par Far_Away dans le forum Débuter
    Réponses: 1
    Dernier message: 11/02/2011, 23h49
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo