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

QxOrm Discussion :

Utilisation de QDataWidgetMapper avec une classe modèle/vue générée


Sujet :

QxOrm

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut Utilisation de QDataWidgetMapper avec une classe modèle/vue générée
    Bonsoir,

    j'ai un petit soucis quand j'appelle la fonction insertRows de ma classe model. Je n'arrive pas a insert une row en dernier position ce qui me pose un problème avec le mapper. Je me suis permit de regarder la fonction insertRows de la classe QxModel<T>, et je me suis aperçu que dans le foreach, le int i était utilisé dans pour le foreach et pas pour le code à l'intérieur. Est ce normal ? si oui, pouvait m'aider a coordonner mon mapper et mon model ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    Le module QxModelView est juste une implémentation de la classe QAbstractItemModel du moteur Qt Model/View.
    Concernant la méthode insertRows(), je te conseille de lire la doc de Qt :
    - ici : http://qt-project.org/doc/qt-4.8/qab...tml#insertRows
    - et ici : http://qt-project.org/doc/qt-4.8/mod...-removing-rows

    Je me suis permit de regarder la fonction insertRows de la classe QxModel<T>, et je me suis aperçu que dans le foreach, le int i était utilisé dans pour le foreach et pas pour le code à l'intérieur. Est ce normal ?
    Le module QxModelView peut contenir des erreurs d'implémentation, c'est possible, mais j'ai relu le code de la méthode et ça me semble correct.
    Si tu lis les docs de Qt (liens ci-dessus), insertRows() est censé ajouter des lignes "vides" à ton modèle :
    - paramètre 1 : correspond à une ligne existante de ton modèle, et tu veux insérer des lignes "vides" avant celle-ci ;
    - paramètre 2 : le nombre de lignes que tu veux insérer ;
    - paramètre 3 : le parent (laisse la valeur par défaut).

    pouvait m'aider a coordonner mon mapper et mon model ?
    Il faudrait donner plus de détails et un peu de ton code pour comprendre exactement ce que tu essayes de faire...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    mon soucis actuellement est que je n'arrive pas insérer une row en dernier position dans une QListView qui utilise le model/view.

    paramètre 1 : correspond à une ligne existante de ton modèle, et tu veux insérer des lignes "vides" avant celle-ci ;
    Avec les tests effectués, je récupère le nombre de ligne actuelle de mon model (int row = monModel->rowCount()), ensuite j’insère une row (monModel->insertRows(row, 1)), et je set l'index de mon mapper a la bonne row (mapper->setCurrentIndex(row)). Seul problème la row s’insère effectivement avant la dernière ligne, ce qui pose problème avec le mapper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int row = monModel->rowCount();
    monModel->insertRows(row, 1);
    mapper->setCurrentIndex(row);
    Or d'après la documentation Qt de la fonction beginInsertRows(http://qt-project.org/doc/qt-4.8/qab...eginInsertRows), il est possible d'ajouter une row en dernière position (voir l'exemple de la fonction beginInsertRows(parent, 4, 5)).

    Donc je sais pas si le problème vient de mon code ou de la lib QxOrm, d’où mes questions sur l’implémentation de la lib.

    Sinon, j'ai testé le update, et cela marche parfaitement .

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    D'apres ton test, il y a donc un soucis dans la classe qx::QxModel <T> : je vais regarder plus en details de mon côté et te tiens au courant...

    Si tu as une idée de correction de la méthode insertRows(), n'hésites pas
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Il y avait bien un soucis, mais pas dans qx::QxModel<T>, dans qx::QxCollection<T> !
    C'est corrigé à partir de cette version :
    http://www.qxorm.com/version/QxOrm_1.3.1_BETA_19.zip
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Ok, je vais tester ça ce soir.

    Merci pour ce rapide correctif

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Bonsoir,

    au niveau de la listview cela est corrigé, mais en ce qui concerne le insert en base, il est un problème.

    j'ai 2 lignes en base, et quand j'essaie d'insert mon nouveau élément, la primary clé est identique a ma première ligne ( Duplicate Key ). Est ce normal ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int row = _mapperUserList->model()->rowCount();
    _userModel->insertRow(row);
    _mapperUserList->setCurrentIndex(row);
    _ui->lineEditIdUser->setText(QUuid::createUuid().toString());
    _ui->lineEditLoginUser->setFocus();
    Et une fois que j'ai rempli tout mes champs je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool test = _mapperUserList->submit();
    _userModel->qxInsert();
    Dans le debug de QxOrm, niveai serveur, la requête est bonne, mais la primary est pas bonne.

    Ps: je vous transmets l'UI par pièce jointe
    Images attachées Images attachées  

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Quand tu appelles (_userModel->qxInsert();), tu essayes d'insérer tout ton modèle en BDD. Et ce n'est pas ce que tu veux faire, puisque tes 2 premières lignes sont déjà en BDD.
    Dans ton cas, tu essayes d'insérer la 3e ligne de ton modèle (la ligne courante), essaye donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool test = _mapperUserList->submit();
    _userModel->qxSaveRow(_mapperUserList->currentIndex());
    Pour que l'interface proposée par la classe qx::QxModel<T> soit plus intuitive et cohérente, je vais ajouter les méthodes suivantes dans la prochaine version (je te tiens au courant dès qu'une nouvelle version est disponible) :
    - qxInsertRow
    - qxUpdateRow
    - qxDeleteRow
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    J'attend avec impatience la nouvelle version de QxOrm .

    Grâce a vos explication je comprend maintenant pourquoi j'avais cette erreur.
    Mais dans ce cas, à quoi cela sert qxInsert() ?

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    à quoi cela sert qxInsert() ?
    A faire des insertions en mode batch dans la BDD : pour insérer une liste d'éléments dans la BDD, c'est plus optimisé d'enregistrer la liste complète, plutôt que d'enregistrer les éléments 1 par 1.

    J'attend avec impatience la nouvelle version de QxOrm
    Essaye déjà avec la méthode qxSaveRow(), ça devrait fonctionner.
    Dès qu'une nouvelle version est disponible avec les nouvelles méthodes, je te tiens au courant...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Bonsoir,

    j'ai un problème quand j'appelle 2 fois la fonction insertRow. Mon programme remonte l'assert de cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <typename Key, typename Value>
    inline bool QxCollection<Key, Value>::insert(long index, const Key & key, const Value & value)
    {
       qAssert(! exist(key));
       if (index < 0) { index = 0; }
       if (index >= size()) { return this->insert(key, value); }
       return m_qxCollection.template get<0>().insert((begin() + index), type_pair_key_value(key, value)).second;
    }
    En faite la key qui est donné a cette fonction est la primaryKey de la fonction de insertRows de QxModel.h

    J'ai contourné cette assert en appelant la fonction qxFetchAll de mon model, ce qui ne me plait pas trop.

    Est ce qu'il existe un autre moyen pour contourné cette assert ?

    J’espère avoir été assez clair avec mes explications.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Est ce qu'il existe un autre moyen pour contourné cette assert ?
    Tu peux essayer avec la dernière version BETA de la bibliothèque QxOrm ?
    Voici le lien : http://www.qxorm.com/version/QxOrm_1.3.1_BETA_20.zip

    Remarque : désolé pour tous ces ajustements !
    Le module QxModelView est tout récent, tu essuies un peu les plâtres de ce nouveau module
    En tout cas merci, car tous tes tests ne feront qu'améliorer la qualité de la bibliothèque QxOrm et du module QxModelView !

    Autre remarque : la BETA 20 inclut les méthodes qxInsertRow() et qxUpdateRow().
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 31
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    concernant ce problème :

    En faite la key qui est donné a cette fonction est la primaryKey de la fonction de insertRows de QxModel.h

    J'ai contourné cette assert en appelant la fonction qxFetchAll de mon model, ce qui ne me plait pas trop.

    Est ce qu'il existe un autre moyen pour contourné cette assert ?
    La fonction qxInsertRows corrige bien le problème.

    Merci pour ce correctif.

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    La fonction qxInsertRow() corrige bien le problème
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

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

Discussions similaires

  1. Utilisation de RPC avec une classe en retour
    Par morey83 dans le forum GWT et Vaadin
    Réponses: 8
    Dernier message: 04/03/2015, 22h03
  2. Utiliser Application.run avec une classe
    Par baya22 dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/04/2012, 12h07
  3. Réponses: 2
    Dernier message: 20/05/2010, 11h06
  4. template et utilisation avec une classe existante
    Par vartav dans le forum Langage
    Réponses: 6
    Dernier message: 14/03/2007, 10h39
  5. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 11h30

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