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

Qt Discussion :

Contrôle de l'édition d'un QTableWidget sur une colonne


Sujet :

Qt

  1. #1
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut Contrôle de l'édition d'un QTableWidget sur une colonne
    Bonjour,

    J'ai une table, avec des cases texte éditables. Je veux que la première colonne ne comporte que des noms uniques. Donc lorsque l'on modifie une case de cette colonne, je veux que la modification ne soit acceptée que si ce texte est unique sur la colonne.

    Premier problème : intercepter l'édition

    Pour ça, le mieux que j'ai trouvé c'est :

    Code C++ : 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
    class MaTable : public QTableWidget {
        Q_OBJECT
     
        public:
            MaTable ( QWidget * parent = 0 );
            ~MaTable();
     
        private:
            bool commitOk;
     
            void commitData ( QWidget * editor );
            void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint );
    };
     
    MaTable::MaTable ( QWidget * parent ) :
        QTableWidget ( parent )
    {
    }
     
    MaTable::~MaTable()
    {
    }
     
    void MaTable::commitData ( QWidget * editor )
    {
        QSet<QString> premiereColonne;
     
        for ( int i = 0; i < rowCount(); i++ ) {
            premiereColonne << item ( i, 0 )->text().trimmed();
        }
     
        QLineEdit* leEditor = qobject_cast<QLineEdit*> ( editor );
     
        if ( premiereColonne.contains ( leEditor->text().trimmed() ) ) {
            commitOk = false;
            QMessageBox::critical ( this, "Erreur", "Cette donnée doit être unique, mais elle existe déjà." );
            leEditor->setFocus();
            leEditor->selectAll();
        }
        else {
            commitOk = true;
            QTableWidget::commitData ( editor );
        }
    }
     
    void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint )
    {
        if ( commitOk ) {
            QTableWidget::closeEditor ( editor, hint );
        }
    }

    J'ai choisi en cas de souci d'afficher une popup d'erreur, et de laisser le champ éditable, avec le texte sélectionné. Ça me semble pas mal comme comportement. L'avantage de redéfinir commitData(), c'est que je peux rester au texte d'avant en n'acceptant pas le commit.
    Bon ça marchouille à quelques détails-près : commitData() est déclenchée deux fois (pour la case de droite aussi)... Et aussi un deuxième gros problème :

    Deuxième problème : ne traiter que les éléments de la première colonne

    Et oui, en passant dans commitData(), je n'ai qu'un pauvre QWidget*, et le souci c'est de trouver à quelle case il correspond pour savoir si je dois le traiter ou non ! J'ai vu que createEditor() semble être le seul endroit où on peut faire le lien entre une case (QModelIndex) et un editor. J'ai voulu redéfinir QStyledItemDelegate pour "sauvegarder" l'editor et avoir une méthode pour le récupérer, mais il n'y a qu'un seul objet delegate de créé pour toutes les cases... Vous n'auriez pas une bonne idée ? Ou un autre chemin à prendre pour faire la même chose ?

    Je ne comprends pas qu'on n'ait pas une méthode editor(index) disponible, alors que dans les sources de Qt il y en a une d'utilisée en private. Ce serait utile je pense.

  2. #2
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Pas de réponse... Bon en attendant, je vais juste désactiver la possibilité d'éditer ma colonne. J'ai cherché encore, en mettant un delegate particulier à la colonne, mais même, je n'arrive pas à faire un lien avec l'editor.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    Bonjour,

    Pour détecter le changement de votre première colonne, il faut connecter un slot à ce signal itemChanged().
    Comme le slot devra accepter un QTableWidgetItem vous aurez à disposition toutes les informations nécessaires, tel que le numéro de la colonne et ainsi vous pouvez faire un test simple pour savoir si on parle bien de la première colonne.

  4. #4
    Membre expérimenté

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Lorsque ce signal arrive, c'est déjà trop tard, l'item a été édité. Avec commitData(), tant que je n'appelle pas QTableWidget::commitData ( editor ), l'item n'est pas modifié, donc si l'utilisateur ferme l'application, les données seront sauvegardées sans erreur (recopie du tableau dans un fichier, dans le destructeur). Après s'il n'y a que ça à faire... Je reste sur mon interdiction d'édition de cette colonne. Mais je trouve vraiment cette histoire de QWidget * editor mal foutue...

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 536
    Points
    219 536
    Billets dans le blog
    124
    Par défaut
    Il est changé dans la vue, mais pas dans le modèle, si ?

Discussions similaires

  1. [SYBASE ASE] Rajouter une contrainte null sur une colonne
    Par Little_Goldo dans le forum Sybase
    Réponses: 1
    Dernier message: 09/02/2005, 10h48
  2. Comment trier une DBGRID en cliquant sur une colonne
    Par sessime dans le forum Bases de données
    Réponses: 8
    Dernier message: 09/10/2004, 16h18
  3. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29
  4. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16
  5. Check sur une colonne de table "en cours"
    Par in dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/07/2003, 09h47

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