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

PyQt Python Discussion :

Case blanche à l'édition d'un combobox sur clé étrangère [QtSql]


Sujet :

PyQt Python

  1. #1
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut Case blanche à l'édition d'un combobox sur clé étrangère
    Bonjour,

    Je gère une base de données relationnelle sous sqlite3 (pas d'accès concurrents) pas très grande (<4000), mais complexe avec une quinzaine de tables et plusieurs contraintes de clés étrangères. Et j'utilise "intensément" la visualisation (et dans certains cas les modifications) des différentes tables et résultats de requêtes SQL grâce aux QSqlRelationalTableModel / QSortFilterProxyModel / QTableView.

    Avec cette visualisation, chaque champs ayant une contrainte de clé étrangère se voit doté d'un combobox dont le contenu liste le contenu de la clé étrangère justement. Cela permet d'exclure toute erreur de saisie, et c'est bien dans cet objectif que je l'ai conçu comme ça.

    Le problème est le suivant: la case d'un tel champ affiche la bonne valeur issue de la base. Mais quand je double-clique, je rentre dans l'édition de la case (QSqlRelationalDelegate) et dans plusieurs cas, j'ai une case vide affichée. j'ouvre alors le combobox, et j'ai la liste ... limitée aux 256 premières valeurs de la clé. Si je descends l’ascenseur du combobox, je finis par récupérer toutes les valeurs par paquet de 256. Ceci fait, j'ai les bonnes valeurs à l'édition sur tous les combobox de cette colonne.

    Bref, c'est le même problème que je citais ici: http://www.developpez.net/forums/d12...al-qtableview/ et pour lequel j'ai une solution (sous-classer QSqlRelationalTableModel): c'est donc encore un problème de buffer que je ne sais pas contourner.

    Ma question: comment forcer le remplissage complet du combobox pour que la case affiche la bonne valeur à l'entrée dans l'édition? A noter que j'ai aussi sous-classé le QSqlRelationalDelegate: j'ai donc déjà la création des combobox dans mon code.

    Merci d'avance!

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai fini par trouver!

    Comme je l'ai dit, j'avais déjà sous-classé QSqlRelationalDelegate utilisé pour éditer les cases du QTableView. La méthode createEditor crée le combobox pour toutes les colonnes ayant une contrainte de clé étrangère.

    Dans cette méthode, une fois que le combobox est créé et "branché" sur la clé étrangère, je force le remplissage complet de cette liste par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                # forcer le remplissage de la liste du combo même si >256
                n = combo.count()
                if n==256:
                    while True:
                        combo.view().scrollToBottom()
                        x = combo.count()
                        if x==n:
                            break
                        else:
                            n = x
    C'est aussi simple que ça: combo.view().scrollToBottom() demande à la liste popup d'accéder au dernier item de la liste, ce qui force cette liste incomplète à se remplir des 256 items suivants. On répète jusqu'à ce qu'il n'y en ait plus (n==x).

    De ce fait, quand on rentre en mode édition dans la case du combobox (double-clic), la valeur affichée 'text' est la bonne valeur et non une case blanche, parce qu'elle est trouvée par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    combo.setCurrentIndex(combo.findText(text, QtCore.Qt.MatchExactly))
    et comme la liste est complète, cette valeur est trouvée à coup sûr!

    Ouf... J'aurais quand même mis 3 heures à trouver ça!

    Si quelqu'un a mieux: je reste à l'écoute!

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 484
    Points : 9 286
    Points
    9 286
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai trouvé bien mieux!

    Quand on demande l'affichage d'une table qui a une contrainte de clé étrangère, on lui donne la relation correspondante: colonne concernée, table qui contient la clé étrangère, etc... et on active cette relation avec model.setRelation(colonne, QtSql.QSqlRelation(table, clé, champs)).

    Le problème est que cette table qui contient la clé étrangère n'est pas complètement chargée: seules les 256 premières lignes le sont.

    Mais on peut facilement obtenir le modèle qui 'pilote' cette table avec model.relationModel(colonne). Et comme on a le modèle, on peut demander à ce que cette table qui contient la clé étrangère soit complètement chargée avec fetchMore()!

    Cela résout, entre autres, complètement le problème du combox qui, cette fois, est complètement chargé sans aucune modification le concernant! La case du combobox en début d'édition n'est donc plus vide.

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

Discussions similaires

  1. [VBA Excel] Comment gerer les combobox sur un Userform
    Par Igloobel dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/02/2007, 22h30
  2. [VBA-E]Déclenchement combobox sur la frappe des caractères
    Par Lexot2 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/10/2006, 02h55
  3. [VB.NET][2.0]Positionner mon combobox sur un item déterminé
    Par Golzinne dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/03/2006, 15h30
  4. [VBA]Execution d'une procédure avec un ComboBox sur Excel
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 31/01/2006, 10h27
  5. [VB.NET] Comment désactiver l'édition d'une combobox
    Par Dnx dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/10/2005, 14h16

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