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 :

[QTableWidget] Remplissage par une requête SQL, mais affichage des lignes dans le désordre [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 [QTableWidget] Remplissage par une requête SQL, mais affichage des lignes dans le désordre
    Bonjour,

    Je suis sous Phython 2.7 et PyQt4.

    J'ai une table dans postgresql qui contient 3916 lignes qui correspondent aux non de réferentiels spatiaux (srtext) et au code du référentiel (srid).
    J'ai besoin de choisir un référentiel pour cela j'ai afficher cette table dans un QtableWidget via une requete sql, je n'ai donc que à faire un signal/slot lorsque je selectionne un ligne. J'ai des erreurs d'affichage de ma table lors que je run mon appli. Le but est de récupérer le code srid pour l'utiliser après dans ma base de donnée Postgis.

    #1 J'ai bien 3916 lignes corespondant à srtext, mais l'orde dans lequel elles s'affichent n'a rien à voir avec la table de ma base de donnée
    #2 Je n'arrive pas à remplir ma seconde colonnes srid, c'est vide.

    Ps: Au dépard j'avais choisi un Qcombox pour afficher mes lignes et j'ai eu le même problème (voir la discution )

    Voici mon code pour ceux qui aurait des idées :

    MErci d'avance
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    # -*- coding: utf-8 -*-
    import psycopg2
    import sys
    from PyQt4 import QtCore, QtGui
    from PyQt4.QtGui import *
    from PyQt4.QtCore import SIGNAL, Qt
     
     
    con = None
     
    class MainWindow(QtGui.QTableWidget):
     
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            layout = QtGui.QVBoxLayout()
     
            self.table_widget = QtGui.QTableWidget() # Créer la table
            self.connect(self.table_widget,SIGNAL('cellClicked(int, int)'), self.returnIndex) # Return la ligne
            self.sridData() # Lance le remplissage
     
            layout.addWidget(self.table_widget)
            self.setLayout(layout)
     
        def sridData(self): ##REMPLISSAGE
            try:
                conn = psycopg2.connect("dbname='postgis_21_sample' user='postgres' host='localhost' password='postgresql'")
            except:
                print "I am unable to connect to the database"
            cur = conn.cursor()        
            self.data= cur.execute("SELECT srtext, srid FROM spatial_ref_sys;")
            data = cur.fetchall()
     
            lignes = len(data)
            columns =  len(data[0])
            i = 0
            j = 0
     
            self.table_widget.setRowCount(lignes)
            self.table_widget.setColumnCount(columns)
            self.table_widget.setHorizontalHeaderLabels(['Label sird', 'srid'])
            #self.table_widget.setColumnWidth(1, 80)
            self.table_widget.horizontalHeader().setResizeMode(0, QHeaderView.Stretch)
     
            for i in range(lignes):
                for j in range(columns):
                    item = QtGui.QTableWidgetItem(data[i][j])
                    self.tabledata = self.table_widget.setItem(i, j, item)
            #self.table_widget.sortByColumn(0, QtCore.Qt.AscendingOrder) # permet de choisir l'ordre d'affichage
     
        def returnIndex(self,row,column):
            row =row +1
            try:
                conn = psycopg2.connect("dbname='postgis_21_sample' user='postgres' host='localhost' password='postgresql'")
            except:
                print "I am unable to connect to the database"
            cur = conn.cursor()        
            self.data= cur.execute("SELECT srid FROM spatial_ref_sys;")
            srid = cur.fetchall()
            srid = srid[row]
            print row, srid
     
     
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        wnd = MainWindow()
        wnd.resize(900, 500)
        wnd.show()
        sys.exit(app.exec_())

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Si ta deuxième colonne est vide if faut que tu vérifies la donnée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            for i in range(lignes):
                for j in range(columns):
                    print data[i][j], type(data[i][j])
                    item = QtGui.QTableWidgetItem(data[i][j])
    Autre chose, tu crées ta table dans une autre table, pourquoi ?
    Ta MainWindow doit hériter de QMainWindow et pas de QTableWidget.

  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
    Bonjour,

    tu crées ta table dans une autre table, pourquoi ?
    Simplement parce que avec seulement un mois d'expérience en Python, Qt, j'ai cherché quelque chose de simple. j'ai essayé un QTableView (sans succès), j'ai encore du mal à bien comprendre ce système de vue et modéle. Je n'ai pas réussi à remplir le tableau via ma base de donnée donc j'ai cherché autre chose et j'ai trouvé le QtableWidget.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si ta deuxième colonne est vide if faut que tu vérifies la donnée.
    Lorsque je fait :
    [QUOTE] print data[i][j], type(data[i][j])QUOTE]
    J'ai bien srtext type str et mon srid type int. Les deux colonnes sont bien affiché dans ma console, mais le sird ne s'affiche toujours pas dans la table.

    Ta MainWindow doit hériter de QMainWindow et pas de QTableWidget.
    Si je la fait hérité de QMainWindow, j'ai plus aucun résultat´à l'affichage de la table. Juste une fenetre vide.

  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,

    Voilà un petit code de test donné à titre de source d'inspiration. Il utilise un QTableView pour afficher une table d"une base de données.

    Il suffira de changer le nom de la base de données, le nom de la table, et de réécrire les fonctions ouvrebaseqt et fermebaseqt en fonction du type de base utilisé (j'utilise ici sqlite3).

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7, PyQt4
     
    import sys, os
    from PyQt4 import QtCore, QtGui, QtSql
     
    #############################################################################
    def ouvrebaseqt(basesql, contrainte=True):
        """ouvre la base 'basesql' et renvoie la connexion (None si échec)"""
     
        # tentative d'ouverture de la base
        db = QtSql.QSqlDatabase.addDatabase(u"QSQLITE")
        db.setDatabaseName(basesql)
        if not db.open():
            db = None
     
        # activation des contraites d'intégrité référentielles
        if (db != None) and contrainte:
            query = QtSql.QSqlQuery(db)
            req = u"PRAGMA foreign_keys=on;"
            if not query.exec_(req):
                query.finish()    # désactive le curseur
                query = None
                fermebaseqt(db)  # fermeture de la base
                db = None             
            if query != None:
                query.finish()    # désactive le curseur
     
        # renvoi de la connexion ouverte (ou None si échec)
        return db
     
    #############################################################################
    def fermebaseqt(db):
        if db!=None:
            db.close()
     
    #############################################################################
    class VoirTableSql(QtGui.QMainWindow):
     
        def __init__(self, basesql, nomtable, parent=None):
            super(VoirTableSql, self).__init__(parent)
     
            self.setWindowTitle(u"Affichage de la table %s" % (nomtable,))
            self.resize(800, 600)
     
            # ouverture de la base SQL
            self.basesql = basesql
            self.db = ouvrebaseqt(self.basesql)
            if self.db == None:
                self.close()
     
            # table à afficher
            self.nomtable = nomtable    
     
            # création du modèle et de sa liaison avec la base SQL
            self.model = QtSql.QSqlRelationalTableModel(self, self.db)
            # stratégie en cas de modification de données par l'utilisateur
            self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
     
            # création de la table et de son lien avec le modèle
            self.vuetable = QtGui.QTableView(self)
            self.vuetable.setModel(self.model)
            self.vuetable.setItemDelegate(QtSql.QSqlRelationalDelegate(self.vuetable))
            # activer le tri en cliquant sur les têtes de colonnes
            self.vuetable.setSortingEnabled(True)
     
            # positionnement du QTableView dans la fenêtre
            self.setCentralWidget(QtGui.QFrame())
            posit = QtGui.QGridLayout()
            posit.addWidget(self.vuetable, 0, 0)
            self.centralWidget().setLayout(posit)
     
            # affiche la table demandée
            self.model.setTable(self.nomtable)
            self.model.select() # peuple le modèle avec les données de la table
     
            # tri si nécessaire selon la colonne 0
            self.model.sort(0, QtCore.Qt.AscendingOrder) # ou DescendingOrder
     
            # ajuste la largeur des colonnes en fonction de leurs contenus
            self.vuetable.resizeColumnsToContents()
     
        #========================================================================
        def closeEvent(self, event=None):
            """Méthode appelée automatiquement à la fermeture de la fenêtre"""
            #fermeture de la base
            fermebaseqt(self.db)
            event.accept()
     
    #############################################################################
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
     
        basesql = u"mabase.db3"
        nomtable = u"photos"
     
        fen = VoirTableSql(basesql, nomtable)
        fen.show()
        sys.exit(app.exec_())

  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
    Salut tyrtamos,

    Juste avant que je regarde cet exemple de plus près, j'ai une petite question. Sqlite3 permet d'accéder à tous les types de base de données ? Je suis sous postgresql, j'ai l'habitude de travailler avec psycopg2.

    Merci pour l'aide en tout cas !

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Tu ne m'as pas compris, je parle de la fenêtre entière, le QTableWidget c'est OK mais tu fais hériter ta main window aussi d'un QTableWidget c'est ça qui ne va pas.

    Si tu ne vois rien dans ta QMainWindow c'est parce qu'il faut utiliser un centralWidget.
    comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class MainWindow(QtGui.QMainWindow):
        def __init__(self, parent=None):
            super(MainWindow, self).__init__(parent)
            self.widget = QtGui.QWidget()
            layout = QtGui.QVBoxLayout(self.widget)
            self.table_widget = QtGui.QTableWidget() # Créer la table
            self.table_widget.cellClicked.connect(self.returnIndex)
            layout.addWidget(self.table_widget)
            self.setCentralWidget(self.widget)
     
            self.sridData()
    Pour ta deuxième colonne, tu dis que la donnée est un type int et la doc dit que ce doit être un type str, alors convertis d'abord.

  7. #7
    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
    Citation Envoyé par aurelie.guegan.15 Voir le message
    Juste avant que je regarde cet exemple de plus près, j'ai une petite question. Sqlite3 permet d'accéder à tous les types de base de données ? Je suis sous postgresql, j'ai l'habitude de travailler avec psycopg2
    Sqlite3 est un système de gestion de base de données relationnelle comme postgresql ou mysql, à part que ce n'est pas un serveur: on l'utilise dans le cadre d'un programme en accès unique (il n'est pas prévu d'accès multiples). Il est aussi moins puissant en terme de fonctionnalités, mais il est très rapide et très pratique à utiliser. D'autant plus qu'il est donné avec Python (le logiciel + son pilote). Même s'il en est resté à la norme SQL92, il supporte de nombreuses fonctionnalités relationnelles. Je l'utilise pour une base de données de plus de 5000 articles, une vingtaine de tables avec des contraintes de clé étrangères, des triggers, des filtrages, des tris, des extractions complexes, des exportations en csv, etc... Les réponses sont quasi instantannées.

    Pour ton application, si postgresql te convient, garde le: il est très bien. il suffira pour adapter mon programme test de modifier ce que j'ai dit.

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

Discussions similaires

  1. MAJ d'un fichier texte par une requête sql
    Par kayserfc dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/12/2009, 08h39
  2. Modifier ou supprimer un enregistrement par une requête SQL
    Par afatdz dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/09/2008, 09h01
  3. Format d'une date récupérée par une requête sql
    Par ZIED dans le forum Zend Framework
    Réponses: 4
    Dernier message: 24/03/2008, 23h17
  4. Enlever l'unicité par une requète SQL
    Par philnext dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/06/2007, 14h22
  5. Réponses: 1
    Dernier message: 04/06/2007, 10h23

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