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 :

QCheckBox dans QTableView

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 65
    Par défaut QCheckBox dans QTableView
    Bonjour à tous,

    Comme dit dans le titre, je cherche à insérer dans une tableview existante un checkbox dans le but de pouvoir faire une sélection multiple.

    Pour le moment, j'ai une class delegate qui permet de récupérer la valeur et l'index

    Par exemple ma fonction me permet cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(field_name == "decision"){
                int decision = valeur_champ.toInt();
                if(decision == 0){//SI la valeur de ce champs == 0 alors on affiche Attente
                    return "Attente";
                }else if(decision == 1){//SI la valeur de ce champs == 1 alors on affiche Accordé
     
                    return "Accordé";
                }
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (field_name == "action")
     {
      //ici doit se retrouver le return avec le check box        
     }
    Ci dessous la fonction me permettant de mettre à jour lma table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Creer_liste_phoning::rafraichir_table(){
     
        QAbstractItemModel* astm = ui->table_liste->model();
        model_personnalise* stm = dynamic_cast<model_personnalise*>(astm);
     
        stm->setTable("liste_prospect");//On donne le nom de la table
     
        stm->select();
     
     
    }
    Avez vous une idée da la façon de faire :
    1 créer pour chaque ligne et que pour la colonne "action" (field_name == "action") un checkbox
    2 récupérer sous forme de tableau ou autre les id sélectionné
    3 créer une boucle pour faire une action sur ces id

    Voilou rien de plus :-°

    Merci par avance à tous

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Tu n'as pas besoin de faire un dynamic_cast, qobject_cast suffit vu que ce sont des QObject.

    1) Réimplémenter flags() de ton modèle pour rajouter le flag Qt::ItemIsUserCheckable pour la colonne que tu veux (test sur index.column() par exemple).

    2) Je crois qu'il te faut parcourir les cases de ton tableau (ou de ta colonne pour optimiser), en appelant data(index, Qt::CheckStateRole). Le QVariant renvoyé contiendra le CheckState.

    3) A l'étape précédente tu auras construit ta QModelIndexList, qu'il te suffira de parcourir...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 65
    Par défaut
    Salut et merci pour la réponse,
    N'aurais tu pas un petit exemple car j'avoue bloquer un peu la .....

    Merci d'avance pour ta compréhension

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Si tu as une question plus précise, je peux t'aider, sinon je pense que c'est assez clair et qu'il faut te documenter. A part peut-être le lien avec tes questions. Déjà tu dois être clair sur le fonctionnement du modèle/vue Qt. J'ai vu que tu as fait ton propre modèle alors j'ai pensé que ce point était bon.

    1) Il ne faut pas "créer des checkbox", mais rendre les données checkable grâce au flag.

    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
    #define COLONNE_ID 3
     
    Qt::ItemFlags model_personnalise::flags ( const QModelIndex& index ) const
    {
        if ( !index.isValid() ) {
            return 0;
        }
     
        Qt::ItemFlags l_Flags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
     
        if ( index.column() == COLONNE_ID ) {
            l_Flags |= Qt::ItemIsUserCheckable;
        }
     
        return l_Flags;
    }
    2) Quelle que soit l'information demandée, c'est data(index, RoleDeLinfo) qui te la donnera. CheckStateRole est déjà un rôle implémenté par défaut dans Qt donc tu peux t'en servir tel quel. Ça ressemblera à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QModelIndexList l_IdList;
    for ( int i = 0; i < rowCount(); i++ )
    {
        QModelIndex l_Index = index ( i, COLONNE_ID, QModelIndex() );
        if ( l_Index.isValid() && static_cast<Qt::CheckState> ( l_Index.data ( Qt::CheckStateRole ).toInt() ) == Qt::Checked )
            l_IdList.append ( l_Index );
    }
    3) Pas de difficulté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach ( const QModelIndex& l_Index, l_IdList )
    {
        QString l_sID = l_Index.data();
        // gérer l'ID
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 65
    Par défaut
    Salut,

    Merci, je vais regarder ça ce soir.
    Par contre, à quoi correspond COLONNE_ID

    Dans mon cas, à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( index.column() == COLONNE_ID ) {
            l_Flags |= Qt::ItemIsUserCheckable;
        }
    je doit mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (field_name == "action") {
            l_Flags |= Qt::ItemIsUserCheckable;
        }
    Est ce bien cela ?

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Oui, mais là le problème c'est de récupérer field_name car tout ce que tu as c'est l'objet index. Tu peux chercher dans le HeaderView horizontal, à l'index index.column().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( headerData ( index.column(), Qt::Horizontal ) == QLatin1String ( "action" ) )
    devrait le faire...

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2014, 08h41
  2. Réponses: 6
    Dernier message: 21/04/2010, 14h27
  3. Affichage d'une table dans QTableView et QSqlTableModel
    Par boumacmilan dans le forum Bases de données
    Réponses: 1
    Dernier message: 13/04/2010, 10h48
  4. Navigation dans QTableView
    Par dj.motte dans le forum Qt
    Réponses: 4
    Dernier message: 09/03/2009, 15h29

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