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 :

Récupérer lignes multiples qtableview python


Sujet :

PyQt Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Points : 36
    Points
    36
    Par défaut Récupérer lignes multiples qtableview python
    Bonjour à tous,
    je souhaite faire une traitement sqlite sur plusieurs lignes mais je n'arrive pas à récupérer une liste des données de ma colonne id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        def test_row(self):
     
            #recherches lignes tableview
            list=[]
            indexes = self.ui.tableView_2.selectionModel( ).selectedRows( )
            for index in sorted(indexes):
                list.append(index.row( ))
                print('ligne %d selectionnée' % index.row( ))
                print('liste', list)
     
            # recherche donnees table
            index = self.ui.tableView_2.selectedIndexes( )[1]
            donnees_table = (self.ui.tableView_2.model( ).data(index))
            print("index : " + str(donnees_table))
    merci

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

    J'avais donné du code pour extraire les données affichées d'un QTableView ici:
    https://www.developpez.net/forums/d1...-d-qtableview/

    Mais je n'ai peut-être pas bien compris le problème: de quel traitement sqlite est-il question?

    Regarde si ça te suffit, sinon, dis ce qui te manque.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Points : 36
    Points
    36
    Par défaut tableview et item
    Bonjour et encore merci Tyrtamos car je cherche depuis un moment

    je n'arrive pas à récupérer les lignes entières sélectionnées, j'ai fait un petit code pour être plus clair, pour mon projet ce sera une bdd sqlite
    je clique sur "test" pour récupérer les lignes sélectionnées (1.2.3 par exemple), l'idée est de récupérer les id de la bdd et de mettre à jour les indexs correspondant d'une colonne.

    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
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    import random
     
     
    class Test(QWidget):
        def __init__(self):
            super( ).__init__( )
     
            # CREATE THE TABLE
            self.table = QTableView(self)  
            self.table.setGeometry(0, 0, 575, 575)
            self.model = QStandardItemModel(self)  
            self.table.setModel(self.model)  
            self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
            self.populate( )
     
     
            self.button = QPushButton('Bouton ', self)
     
            layout = QVBoxLayout(self)
            layout.addWidget(self.table)
            layout.addWidget(self.button)
            self.setLayout(layout)
     
            self.button.clicked.connect(self.test)
     
     
     
     
     
        def populate(self):
     
            values = []
            for i in range(10):
                sub_values = []
                for i in range(4):
                    value = random.randrange(1, 100)
                    sub_values.append(value)
                values.append(sub_values)
     
            for value in values:
                row = []
                for item in value:
                    cell = QStandardItem(str(item))
                    row.append(cell)
                self.model.appendRow(row)
     
            self.show( )
     
        def test(self):
     
            # je recupére les lignes selectionnées avec click button
            list = []
            indexes = self.table.selectionModel( ).selectedRows( )
            for index in sorted(indexes):
                list.append(index.row( ))
                print('ligne %d selectionnée' % index.row( ))
                print('liste', list)
     
            # j'arrive à recuperer un index
            index = self.table.selectedIndexes( )[1]
            donnees_table = (self.table.model( ).data(index))
            print("index : " + str(donnees_table))
     
            # comment arriver à récupérer numéro ligne et la ligne (ce sera une bdd sql dans mon projet)
            # ligne 1, et les indexs de toute la ligne dans le tableview
            # ligne 2, et es indexs de toute la ligne dans le tableview
     
    if __name__ == '__main__':
        import sys
     
        app = QApplication(sys.argv)
        ex = Test( )
        sys.exit(app.exec_( ))
    merci

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

    C'est normal. Tu veux récupérer une des données d'une ligne en ne sélectionnant qu'une case => quand la ligne "index = self.table.selectedIndexes( )[1]" s'exécute, elle se plante parce qu'il n'y a qu'une seule donnée disponible (ça se plante avec le "[1]" final).

    La preuve: ton programme fonctionne si tu sélectionnes la ligne complète en cliquant sur son entête à gauche. Essai!

    Suggestion: puisque tu sais trouver le numéro de ligne qui t'intéresse, tu devrais pouvoir trouver n'importe quelle donnée de cette ligne en utilisant le code dont je t'ai donné le lien précédemment.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Points : 36
    Points
    36
    Par défaut index tableview
    bonjour,
    désolé je n'ai pas ton expérience, ça fait un moment que je tourne en rond.
    j'ai du mal à comprendre ton code si tu pouvais me le compléter ?
    Merci

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Essaie ça dans la méthode test():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        def test(self):
     
            indexes = self.table.selectionModel( ).selectedIndexes( )
            print(len(indexes)) # nombre de cases sélectionnées
            for index in indexes:
                row = index.row()
                col = index.column()
                item = self.table.model().item(row, col)
                elem = item.data(Qt.DisplayRole) 
                print("case:", row, col, "=>", elem)
    Ainsi, quelques soient les cases sélectionnées, y compris pour des cases discontinues, on trouve les coordonnées [row, col] de chacune des cases dans l'ordre de leur sélection.

    Si tu ne souhaites que la colonne d'indice 1 de toutes les lignes sélectionnées, tu cherches les items de coordonnées [row, 1]. Mais s'il y a plusieurs cases sélectionnées de la même ligne, tu auras plusieurs fois la même données. Pour éviter ça, il faut mettre le numéro de ligne dans une liste et faire le test pour savoir si la ligne a déjà été rencontrée.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Points : 36
    Points
    36
    Par défaut index tableView
    Encore merci pour l'info ton code ma permis de trouver ce que je cherchai, je voulais récupérer la ligne entière je vais partir sur différent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tests=self.table.selectionModel( ).selectedIndexes()
            for test in tests:
                row = test.row( )
                col = test.column( )
                item = self.table.model( ).item(row, col)
                elem = item.data(Qt.DisplayRole)
                print("case:", row, col, "=>", elem)

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Points : 36
    Points
    36
    Par défaut Problème item
    Désolé je perds pied.

    j'imagine que je dois faire avec le model QStandardItemModel mais j'ai toujours des erreurs ? python ne reconnait pas item dans ma fonction.

    pourtant j'ai mis self.tableView_2.setEditTriggers(QtWidgets.QAbstractItemView.AllEditTriggers)

    je connecte ma bdd ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     db = QSqlDatabase.addDatabase("QSQLITE")
            db.setDatabaseName("bdd_Factu.db")
            db.open( )
     
            self.model = QSqlTableModel(None, db)
     
            self.model.setTable("FACTU")
            self.model.select( )
            self.ui.tableView_2.setModel(self.model)
    fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     def test(self):
     
     
            tests = self.ui.tableView_2.selectionModel( ).selectedIndexes( )
            for test in tests:
                row = test.row( )
                col = test.column( )
                item = self.ui.tableView_2.model( ).item(row, col)
                elem = item.data(Qt.DisplayRole)
                print("case:", row, col, "=>", elem)
    merci

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

    Je n'ai pas assez d'infos pour t'aider. Tu dis que item n'est pas reconnu, mais il faut avoir le message complet de l'erreur.

    Or, PyQt5 ne remonte pas toujours correctement les erreurs. Pour avoir des messages intelligibles, voilà comment je fais:

    J'ajoute dans le même répertoire que le programme principal, le fichier "msgerreur.py" qui contient:

    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
    # -*- coding: utf-8 -*-
     
    from PyQt5.QtCore import (QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, 
                        QtFatalMsg, QtSystemMsg)
    from PyQt5.QtWidgets import QMessageBox
     
    #############################################################################
    def messagederreur(typerr, contexte, msgerr):
        """Permet d'afficher et/ou de neutraliser les messages d'erreur.
           Pour les messages critiques: affiche dans une fenêtre graphique.
           Mise en place par: QtCore.qInstallMessageHandler(messagederreur)
        """
        if typerr==QtDebugMsg:
            # exemple de désactivation d'un message
            #if "QWindowsFileSystemWatcherEngine: unknown message" in msgerr:
            #    return 
            print("DEBUG:\n{}\n".format(msgerr))
     
        elif typerr==QtWarningMsg:
            # exemple de désactivation d'un message
            #if "QFont::setPixelSize: Pixel size <= 0 (0)" in msgerr:
            #    return
            print("WARNING:\n{}\n".format(msgerr))
     
        elif typerr in [QtCriticalMsg, QtFatalMsg, QtSystemMsg]:    
            print("ERREUR CRITIQUE:\n{}\n".format(msgerr))
            QMessageBox.critical(None, 
                "ERREUR CRITIQUE:",
                "{}\n".format(msgerr))
        else:
            # message retourné par QtCore.QtInfoMsg créé à partir de Qt 5.5
            print("INFO:\n{}\n".format(msgerr))
    Et dans le programme principal, juste après le "app = QApplication(sys.argv)", j'ajoute les 2 lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        from msgerreur import messagederreur  
        qInstallMessageHandler(messagederreur)
    Selon l'importation, ajouter si nécessaire le QtCore devant le "qInstallMessageHandler".

    Cela permet d'avoir une bien meilleure remontée des erreurs de PyQt5.

    J'ai limité les messages graphiques (QMessageBox) aux erreurs critiques, les autres erreurs étant affichées par des "print" et donc dans une console. Tu peux modifier ça comme tu veux.

    Applique ça et donne le message d'erreur.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2019
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Décembre 2019
    Messages : 62
    Points : 36
    Points
    36
    Par défaut récupérer ligne tableview sqlite
    Bonjour tyrtamos

    Ci-joint le code raccourcis, j'imagine que la méthode n'est pas bonne mais j'ai du mal à comprendre la doc QT.
    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
    import sqlite3
    import sys
    from os.path import exists
     
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtCore import Qt, qInstallMessageHandler
    import numpy as np
    from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
     
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
     
     
     
    if not exists("projects4.db"):
        connection = sqlite3.connect("projects4.db")
        cursor = connection.cursor()
        cursor.execute(""" CREATE TABLE projects (A TEXT, B TEXT, C INTEGER)""")
        cursor.execute("""INSERT INTO projects VALUES 
            ('aa', 'ab','ac'),
            ('ba', 'bb', 'bc'),
            ('da', 'dc', 'dd')
        """)
        connection.commit()
        connection.close()
     
    class Test(QWidget):
        def __init__(self):
            super( ).__init__( )
     
            # CREATION TABLE
            db = QSqlDatabase.addDatabase("QSQLITE")
            db.setDatabaseName("projects4.db")
            db.open( )
            model = QSqlTableModel(None, db)
            model.setTable("projects")
            model.select( )
            self.view = QTableView( )
            self.view.setModel(model)
     
            # CREATION BOUTON
            self.button = QPushButton('Bouton ', self)
     
     
     
            # PLACE DANS LAYOUT
            layout = QVBoxLayout(self)
            layout.addWidget(self.view)
            layout.addWidget(self.button)
            self.setLayout(layout)
            self.button.clicked.connect(self.test)
     
     
        # RECHERCHE DONNEES CLIC BOUTON
     
     
        def test(self):
     
            # je recupére les lignes selectionnées avec click button
            list = []
            indexes = self.view.selectionModel( ).selectedRows( )
            for index in sorted(indexes):
                list.append(index.row( ))
                print('ligne %d selectionnée' % index.row( ))
                print('liste', list)
            # erreur item pour je recupére les donnees des lignes 
            for index in indexes:
                row = index.row( )
                col = index.column( )
                item = self.view.model( ).item(row, col)
                elem = item.data(Qt.DisplayRole)
                print("case:", row, col, "=>", elem)
     
     
     
    if __name__ == '__main__':
        import sys
     
        app = QApplication(sys.argv)
        from package.msgerreur import messagederreur
        qInstallMessageHandler(messagederreur)
        fenetre = Test( )
     
        fenetre.show( )
        fenetre.resize(500, 300)
        sys.exit(app.exec_( ))

    encore merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/06/2012, 13h51
  2. [ListBox] Récupérer sélection multiple ?
    Par Kylen dans le forum ASP.NET
    Réponses: 4
    Dernier message: 29/06/2006, 14h57
  3. récupérer ligne date maximum
    Par StIcK dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/01/2006, 01h51
  4. CR9 - Récupérer valeurs multiples d'un champ paramètre
    Par CR9-Deb dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 06/07/2005, 16h08

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