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 :

Pas d'update avec QTableView et QStandardItemModel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut Pas d'update avec QTableView et QStandardItemModel
    Je débute avec l'utilisation des View et Model.

    J'ai créé ma classe qui dérive de QStandardItemModel dans laquelle j'ai ajouté une méthode pour lire les données d'un fichier et les écrires.
    J'ai aussi ajouté une méthode pour insérer les données.
    Cette méthode fait appel à la méthode insertRow après avoir construit la liste des QStandardItem à ajouter.

    Le problème est que la QTableView ne réactualise pas la liste affichée.
    Je remplis le modèle à partir du fichier avant d'appeler setModel(). A la fin je sauvegarde le contenu du modèle et je trouve bien la ligne insérée.

    C'est donc comme si le signal de l'insertion n'était pas envoyé au QTableView ou n'était pas pas pris en compte par celui-ci.

    Avec le débug, j'ai vérifié que le begin... et le end sont bien appelés. J'ai vu qu'il y a un émit qui est appelé, mais quand j'ai voulu tracer dedans, le debugger a passé au dessus. Je suppose qu'on ne peut pas tracer un émit.

    J'ai lu un bouqui et la doc de trolltech sur le sujet, et normalement c'est sensé fonctionner comme j'ai fait.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Par défaut
    J'ai réalisé une application la plus simple possible pour reproduire le problème.
    Et là tout fonctionne correctement. C'est moyennement positif car j'aurais préféré comprendre mon erreur.

    Pour ceux qui seraient comme moi confronté à ce type de problème et en arriveraient à douter de tout, voici le code de l'application simple réalisée et qui fonctionne. Je masque la colonne 0 pour tester. C'est ce que je faisais dans le programme qui ne fonctionne pas.

    J'ai créé une application Gui avec un QDialog contenant 1 QTableView, 1 bouton ajouter et un bouton terminer. Le QTableView a pour nom itemList.

    Dans le constructeur j'instantie un modèle du type QStandardItemModel avec le dialogue comme parent.

    Le constructeur de la classe est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dialog::Dialog(QWidget *parent)
        : QDialog(parent), ui(new Ui::Dialog), m_rowNo(0)
    {
        ui->setupUi(this);
        m_model = new QStandardItemModel( this );
        addItem();
        addItem();
     
        ui->itemList->setModel( m_model );
        ui->itemList->hideColumn( 0 );
    }
    La méthode addItem() est un slot auquel je connecte le bouton ajouter. Cette méthode ajoute une ligne dans le tableau. En voici le code

    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
    void Dialog::addItem()
    {
        QList<QStandardItem*> newRow;
        QString txt = QString( "test %1" ).arg(m_rowNo);
        newRow.append( new QStandardItem( txt ) );
        newRow.append( new QStandardItem( txt ) );
        newRow.append( new QStandardItem( txt ) );
     
        int row = ui->itemList->currentIndex().row();
        if( row == -1 )
            m_model->appendRow( newRow );
        else
            m_model->insertRow( row, newRow );
        ui->itemList->resizeRowsToContents();
     
       ++m_rowNo;
    }
    Je définis les connections dans l'éditeur d'interface. Il faut pour cela ajouter le slot addItem() dans la liste des slots du dialogue. Le bouton terminer est connecté à accept().

    Ceci fonctionne parfaitement. J'ai alors modifié les propriétés de ma QTableView pour qu'il ne sélectionne qu'une seule ligne et toute la ligne. J'ai également désactivé l'affichage du contour des boites.

    Une des différences importante par rapport au programme initial, est de ne plus étendre par héritage la classe QStandardItemModel. Il est beaucoup plus simple de centraliser toutes les méthodes dans la classe dialogue. C'était une erreur de débutant. Le risque est de surcharger par erreur une méthode de la classe parent. J'avais donc changé cela dans le programme initial, mais sans succès.

    Pour ne plus être bloqué par ce type de problème, une bonne stratégie est de commencer par une version la plus simple, telle que décrite ci dessus ; puis d'ajouter les fonctionnalités et affiner progressivement en testant régulièrement. Dès qu'un problème est détecté on sait quel changement l'a généré.

    En utilisant un système de gestion de version (ex. subversion), on peut retrouver la liste précise de tous les changements depuis le dernier commit.
    J'espère que cette réponse pourra vous être utile.

Discussions similaires

  1. [PDO] Requete UPDATE avec PDO fonctionnelle en local mais pas sur OVH
    Par olinet dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/12/2014, 14h57
  2. UPDATE avec jointure ne fonctionne pas sans message d'erreur
    Par EnRadeSurEclipse dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/01/2010, 22h22
  3. Pas d'erreur avec UPDATE si un champ n'existe pas !
    Par poiwalt dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/01/2009, 15h32
  4. Update avec Select : je n'y arrive pas.
    Par marye77 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 22/02/2008, 16h51
  5. Réponses: 7
    Dernier message: 08/10/2007, 09h15

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