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 :

Problème avec QlistView avec une base de donnée [QtGui]


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut Problème avec QlistView avec une base de donnée
    Bonjour à tous,

    Je souhaite pour un plugin afficher dans une liste les résultats d'un requête sql et pouvoir en sélectionner une ou plusieurs lignes.

    J'ai choisi d'afficher la liste de mes résultats via une QlistView et de rendre chaque résultat steckable. J'ai suivie ce tuto : http://www.pythoncentral.io/pyside-p...darditemmodel/

    Pour le moment je ne suis qu'à la partie affichage. Je n'ai pas encore faire la selection des lignes.

    Voici mon 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtGui import QApplication, QItemSelectionModel, QStandardItem, QStandardItemModel
    import sys
    import psycopg2
     
    app = QApplication(sys.argv)
    listView = QtGui.QListView()
    listView.setWindowTitle('Example List')
    listView.setMinimumSize(600, 400)
    listView.setEnabled(False)
    model = QStandardItemModel(listView)
    try:
        conn = psycopg2.connect("dbname='qgis_db' user='postgres' host='localhost' password='postgresql'")
    except Exception as e:
        print "I am unable to connect to the database", e
    cur = conn.cursor()
    conn.set_isolation_level(0)
     
    try:
        cur.execute("select  pt_projname from point group by pt_projname")
    except psycopg2.ProgrammingError as e:
        print e
    project =cur.fetchall()
     
    print type(project)
    print project
     
    for i in project:
        # Create an item with a caption
        item = QStandardItem(i)
        # Add a checkbox to it
        item.setCheckable(True)
        # Add the item to the model
        model.appendRow(item)
    listView.setModel(model)
    listView.show()
    app.exec_()
    Voici l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Traceback (most recent call last):
      File "C:/Users/AUGU/Documents/GL/code_python/BASE/listView/test1.py", line 31, in <module>
        item = QStandardItem(i)
    TypeError: arguments did not match any overloaded call:
      QStandardItem(): too many arguments
      QStandardItem(QString): argument 1 has unexpected type 'tuple'
      QStandardItem(QIcon, QString): argument 1 has unexpected type 'tuple'
      QStandardItem(int, int columns=1): argument 1 has unexpected type 'tuple'
      QStandardItem(QStandardItem): argument 1 has unexpected type 'tuple'
    Et voici les caractéristiques de ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <type 'list'>
    [(None,), ('test1',), ('test3',), ('test2',)]
     
    <type 'tuple'> 
    (test1,)
    Dans ma liste j'ai des turples. Je ne comprend pas pourquoi, je n'obtiens pas des strings ?

    Une idée pour résoudre ce problème ?
    Ou une autre manière de procéder pour avoir un résultat semblable (ex: avec une combobox et l'affichage des éléments selectionnés)

    Merci d'avance

  2. #2
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    Bonjour à tous !
    J'ai résolu mon problème d'affichache par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in project:
        # Create an item with a caption
        item = QStandardItem(i[0])
        # Add a checkbox to it
        item.setCheckable(True)
        # Add the item to the model
        model.appendRow(item)
    Par contre si jamais vous pouvez m'expliquer l'histoire du turple, je veux bien car j'ai toujours pas compris et c'est dommage de résoudre un problème sans savoir réellement pourquoi il avait lieu d'être !

    Merci

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    Re Bonjour pour ce troisième message !

    Je continue mes petits tests sur ma QlistView et malheureusement je n'arrive pas du tout à récupérer les éléments de ma liste selectionné.

    J'ai pu voir que je pouvais connecter mes éléments du model avec quelque chose comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.itemChanged.connect(on_item_changed)
    Mais je n'ai pas trouvé les fonctions capablent de récupérer dans une liste/turple les index et les items selectionnés.

    Pourriez vous m'indiquer la bonne demarche pour construire ma fonction on_item_changed ?

    Merdi d'avance !

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour le tuple:

    Quand on extrait des données d'une base de données avec une requête sql et un "fetchall", on obtient effectivement une liste de tuples, conformément aux spécifications de la PEP 249 (http://legacy.python.org/dev/peps/pep-0249/).

    Chaque tuple (correspondant à chaque ligne) contenant les champs demandés séparés par une virgule:

    [(ligne1champs1, ligne1champs2, ligne1champ3, ...), (ligne2champs1, ligne2champs2, ligne2champ3, ...), (ligne3champs1, ligne3champs2, ligne3champ3, ...)]

    Ces tuples existent, même si on n'a qu'un seul champ:

    x = [(ligne1champs1), (ligne2champs1), (ligne3champs1)]

    On obtient facilement la liste des valeurs avec:

    liste = [elem[0] for elem in x] => [ligne1champs1, ligne2champs1, ligne3champs1]

    Pour le QListView:

    Un QListView est fait pour être "branché" directement sur des données avec un "model". L'avantage principal est que si on modifie les données dans le QListView, les données d'origine sont (facilement) modifiées aussi.

    Dans ce cas, le plus logique est que ces données soient déjà un champ d'une table de base de données. Mais si c'est le cas, le branchement est fait en utilisant le pilote sql de PyQt4 (et la machinerie QtSql) et non celui de Python.

    On peut, bien sûr, brancher le QListView sur une simple liste Python obtenu par un moyen quelconque (y compris par extraction d'une base de données) avec un modèle comme "QAbstractListModel". Mais, à mon avis, c'est une complexité inutile: autant utiliser un QListWidget et le remplir comme on remplirait un QCombobox: on n'a alors plus besoin d'un "model".

    Mais, bien sûr, même si ta solution me semble inutilement compliquée, elle devrait tout de même marcher!

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    Bonjour tyrtamos,

    Merci pour l'explication ! C'est bien plus claire maintenant !
    En effet je me complique souvent la vie lorsque l'on parle de programmation Je suis encore novice et j'ai pas les bons réflexes !
    Je vais regarder pour mettre un QListWidget au lieu d'un QListView, j'ai réellement pas besoin d'un truc complexe c'est juste pour selectionner des valeurs et mes retrouner !

    Merci encore pour tes conseils

  6. #6
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    Bonjour,

    J'ai donc essayer de faire un petit script avec QlistWidget. J'arrive à faire presque tout ce que je voullais.
    J'ai donc une liste avec des élements à cocher et lorsque je sélectionne, je récupère l'élement selectionné dans une liste.`
    J'ai encore des petites questions :

    Question1
    J'aimerais maintenant faire l'inverse, lorsque je décoche un de mes chekbox, j'aimerais suprimmer l'élément correspondant de ma liste.
    Comment faire cette dernière manipulation ?

    Question2
    Dans le scipt de test j'ai une checkbox qui une fois selectionné, va cocher tous les éléments de ma liste. Dans ce script de test ca fonctionne bien. Lorsque je l'ai copier dans mon réel code, ca ne fonctionne plus si bien.
    Au lieu d'effacer de la liste les élements non coché et de les remplacer par les éléments coché, il ajoute les éléments à ma liste.
    Je ne comprend pas pourquoi cette ligne ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       item = self.listWidget.takeItem(self.listWidget.currentRow())


    Je met en piéce jointe les deux scripts pour que vous puissiez m'aider



    Merci d'avance pour le coup de main
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/08/2012, 10h28
  2. [Portlet] portlet avec un accès à une base de donné mysql
    Par prodit96 dans le forum Portails
    Réponses: 1
    Dernier message: 12/01/2009, 15h41
  3. Réponses: 1
    Dernier message: 19/02/2008, 00h32
  4. Problème de copie d'une base de données MySQL avec PHP
    Par rheem dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 15/10/2007, 14h52
  5. Réponses: 0
    Dernier message: 22/08/2007, 16h26

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