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 :

Recherche d'un item dans QTableWidget et changement de couleur


Sujet :

PyQt Python

  1. #1
    Membre du Club
    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
    Points : 59
    Points
    59
    Par défaut Recherche d'un item dans QTableWidget et changement de couleur
    Bonjour à tous,

    Je travail sur un petit plugin et aujourd'hui je m'attaque à un QTableWidget où je sélectionne une ligne en double cliquant dessus mais qui c'est pas très fonctionnel. Le but est de rendre la recherche de la ligne souhaité simple et rapide car j'ai genre 3000 lignes dans ma table.

    Ce que j'aimerais faire est relativement simple, mais je ne sais par quoi commencer et quoi utiliser. Voici le principe :
    1) Dans un QlineEdit, l'utilisateur tape des mots clés
    2) Je fait une recherche avec ses mots clés dans ma table
    3) Je n'affiche que les lignes où se trouvent ces mots clés.

    Voici comment je pensais procéder :
    1) si le QlineEdit est vide alors je remplis mon QTableWidget normalement
    2) si le QlineEdit n'est pas vide je remplie remplis mon QTableWidget avec les résultats de la recherche


    Mes problèmes sont :
    1) je n'arrive pas à remplir ma table avec les résultats des recherches.
    2) lorsque j'efface tout dans le QlineEdit, je ne sais pas comment revenir aux remplissage de départ.
    3) l'outil que j'utilise pour la recherche rapide .findItems, ne me semble pas approprié à ma recherche. Il cherche selon une chaîne de caractères précise.

    Voici mon code légèrement modifié pour éviter d'avoir besoin de la base de donnée :

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'tableWidaget.ui'
    #
    # Created: Wed Aug 13 12:27:35 2014
    #      by: PyQt4 UI code generator 4.10.2
    #
    # WARNING! All changes made in this file will be lost!
     
    import sys
    from PyQt4 import QtCore
    from PyQt4 import QtGui
    from PyQt4.QtGui import QAbstractItemView
    from PyQt4.QtCore import QObject, pyqtSignal
    from PyQt4.QtCore import QEvent
     
    import psycopg2
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_Srid(QtGui.QDialog):
        signal_srid = pyqtSignal(str)
        def __init__(self, parent=None):
            super(Ui_Srid, self).__init__(parent)
            self.text = ''
     
            self.main = parent
            self.setObjectName(_fromUtf8("self"))
            self.setWindowModality(QtCore.Qt.WindowModal)
            self.resize(781,427)
     
            self.gridLayoutWidget = QtGui.QWidget(self)
            self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 30, 761, 371))
            self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
            self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
            self.gridLayout.setMargin(0)
            self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
     
            self.lineEdit = QtGui.QLineEdit(self.gridLayoutWidget)
            self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
            self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
     
            self.tableWidget = QtGui.QTableWidget(self.gridLayoutWidget)
            self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
            self.tableWidget.setColumnCount(0)
            self.tableWidget.setRowCount(0)
            self.gridLayout.addWidget(self.tableWidget, 1, 1, 1, 1)
            self.label = QtGui.QLabel(self.gridLayoutWidget)
            self.label.setObjectName(_fromUtf8("label"))
            self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
     
            self.retranslateUi()     
            self.tableWidget.cellDoubleClicked.connect(self.returnSRID) 
            QtCore.QMetaObject.connectSlotsByName(self)
            self.sridData() # Rempli la table
            QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")), self.close)
            self.lineEdit.textEdited.connect(self.on_qline_edit)
            self.show()
     
        def retranslateUi(self):
            self.setWindowTitle(_translate("Srid", "Srid", None))
     
        def sridData(self): ##REMPLISSAGE
           #Remplissage avec la base de donnée 
    ##        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_text FROM spatial_ref_sys;")
    ##        data = cur.fetchall()          
    ##        lignes = len(data)
    ##        columns =  len(data[0])
    ##        i = 0
    ##        j = 0
    ##        self.tableWidget.setRowCount(lignes)
    ##        self.tableWidget.setColumnCount(columns)
    ##        self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
    ##        self.tableWidget.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)
    ##        
    ##        for i in range(lignes):
    ##            for j in range(columns):
    ##                item = QtGui.QTableWidgetItem(data[i][j])
    ##                self.tableWidget.setItem(i, j, item)
     
            #Exemple
     
            #Affichage du tableau en entier lors que rien n'est entré dans le qLineEdit
            if  self.lineEdit.text()=="":
                lista = ['aa', 'ab', 'ac', 'ad','ae','af','ag','ah','ai','aj','ak','al' ]
                listb = ['1', '2','3','4','5','6','7','8','9','10','11','12']
                self.data = {'A':lista, 'B':listb}
                n = 0
                self.tableWidget.setRowCount(len(lista))
                self.tableWidget.setColumnCount(len(self.data))
                self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
                self.tableWidget.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)        
                for key in self.data:
                    m = 0
                    for item in self.data[key]:
                        self.item = QtGui.QTableWidgetItem(item)
                        self.tableWidget.setItem(m, n, self.item)
                        m += 1
                    n += 1
     
        def returnSRID(self, row, col): # Apellé seulemment lorsque l'on selection une ligne
            column = col or 1
            srid_selected = self.tableWidget.item(row, column).text()
            self.main.selected = srid_selected
     
        def on_qline_edit(self):
            self.text = self.lineEdit.text()
            print 'Texte lineEdit:',self.text
            #Remplissage du tableau avec les résultats de la recherche rapide
            if not self.lineEdit.text()=="":
                #Recherche des elements entrés dans le QlineEdit dans le QTableWidget
                items = self.tableWidget.findItems(self.lineEdit.text(), QtCore.Qt.MatchContains) # Qt::MatchRegExp ou Qt::MatchWrap
                if items:
                    #Liste les résultats trouvés
                    results = '\n'.join('row %d column %d' % (item.row() + 1, item.column() + 1) for item in items)
                    print results
                    #Remplie le tableau avec les résultats de la recherche
                    for item in items :
                        self.data_seach = self.tableWidget.item(item.row(), item.column()).text()
                        print 'data:',self.data_seach
                        self.tableWidget.setRowCount(len(self.data_seach))
                        self.tableWidget.setColumnCount(len(self.data_seach))
                        self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
                        self.tableWidget.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)        
                        for key in self.data:
                            m = 0
                            for item in self.data_seach[key]:
                                self.item = QtGui.QTableWidgetItem(item)
                                self.tableWidget.setItem(m, n, self.item)
                                m += 1
                            n += 1
     
     
     
    #self.tableWidget.item(self.item.row(),self.item.column()).setBackground(QtGui.QColor(100,100,150))           
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QDialog()
        ui = Ui_Srid()
        #MainWindow.show()
        sys.exit(app.exec_())
    Merci d'avance pour vôtre aide, vos conseils et tous les liens tuto que vous pourriez me donner !

  2. #2
    Membre du Club
    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
    Points : 59
    Points
    59
    Par défaut Augmenter les performances de la recherche rapide
    Bonjour à tous,

    Je met à jour cette discution, car j'ai en partie résolu mon problème, mais j'ai encore des questions et des soucies.

    Maintenant j'arrive à :
    1)Afficher mon tableau de valeurs à choisir via un QTableWidget
    Avec une matrice de valeur et via une basse de donnée postgresql
    2)Faire une recherche d'élements dans le tableau via un QLineEdit et la fonction .findItems()
    Je récupère les élements de la recherche dans une nouvelle matrice
    3) Afficher les élements trouvés dans ma recherche dans mon tableau
    Via la matrice précédente

    J'ai donc ce que je voullais : Faire une recherche dans le tableau et l'afficher en direct.

    Voici le code qui "Fonctionne" :
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    # -*- coding: utf-8 -*-
     
    # Form implementation generated from reading ui file 'tableWidaget.ui'
    #
    # Created: Wed Aug 13 12:27:35 2014
    #      by: PyQt4 UI code generator 4.10.2
    #
    # WARNING! All changes made in this file will be lost!
     
    import sys
    from PyQt4 import QtCore
    from PyQt4 import QtGui
    from PyQt4.QtGui import QAbstractItemView
    from PyQt4.QtCore import QObject, pyqtSignal
    from PyQt4.QtCore import QEvent
     
    import psycopg2
     
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
     
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
     
    class Ui_Srid(QtGui.QDialog):
        signal_srid = pyqtSignal(str)
        def __init__(self, parent=None):
            super(Ui_Srid, self).__init__(parent)
            self.text = ''
     
            self.main = parent
            self.setObjectName(_fromUtf8("self"))
            self.setWindowModality(QtCore.Qt.WindowModal)
            self.resize(781,427)
     
            self.gridLayoutWidget = QtGui.QWidget(self)
            self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 30, 761, 371))
            self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
            self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
            self.gridLayout.setMargin(0)
            self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
     
            self.lineEdit = QtGui.QLineEdit(self.gridLayoutWidget)
            self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
            self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
     
            self.tableWidget = QtGui.QTableWidget(self.gridLayoutWidget)
            self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
            self.tableWidget.setColumnCount(0)
            self.tableWidget.setRowCount(0)
            self.tableWidget.setAlternatingRowColors(True)
            self.gridLayout.addWidget(self.tableWidget, 1, 1, 1, 1)
            self.label = QtGui.QLabel(self.gridLayoutWidget)
            self.label.setObjectName(_fromUtf8("label"))
            self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
     
            self.retranslateUi()
            # Rempli la table
            self.sridData() 
            #Double cliaue : Selection de l'élement et fermeture de la fenêtre
            self.tableWidget.cellDoubleClicked.connect(self.returnSRID)
            QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")), self.close)
            QtCore.QMetaObject.connectSlotsByName(self)
            #Entré d'un texte dans la barre de recherche    
            self.lineEdit.textChanged.connect(self.on_qline_edit)
            self.lineEdit.editingFinished.connect(self.sridData)
            #Affiche le tout 
            self.show()
     
        def retranslateUi(self):
            self.setWindowTitle(_translate("Srid", "Srid", None))
     
        def sridData(self): ##REMPLISSAGE
           #Remplissage avec la base de donnée
            if  self.lineEdit.text()=="":
    ##            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_text FROM spatial_ref_sys;")
    ##            data = cur.fetchall()          
    ##            lignes = len(data)
    ##            columns =  len(data[0])
    ##            i = 0
    ##            j = 0
    ##            self.tableWidget.setRowCount(lignes)
    ##            self.tableWidget.setColumnCount(columns)
    ##            self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
    ##            self.tableWidget.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)
    ##            
    ##            for i in range(lignes):
    ##                for j in range(columns):
    ##                    item = QtGui.QTableWidgetItem(data[i][j])
    ##                    self.tableWidget.setItem(i, j, item)
     
            #Affichage du tableau en entier lors que rien n'est entré dans le qLineEdit           
                lista = ['aa', 'ab', 'ac', 'bonjour','ae','af','test','ah','ai','aj','ak','sird' ] #col1
                listb = ['1', 'qgis','3','4','5','6','hamburg','8','9','10','11','12'] #col2
                self.data = {'A':lista, 'B':listb}
                print 'data rempli 1ere fois : ' ,self.data
                n = 0
                self.tableWidget.setRowCount(len(lista))
                self.tableWidget.setColumnCount(len(self.data))
                self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
                self.tableWidget.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)        
                for key in self.data:
                    m = 0
                    for item in self.data[key]:
                        self.item = QtGui.QTableWidgetItem(item)
                        self.tableWidget.setItem(m, n, self.item)
                        m += 1
                    n += 1
                    self.rows = self.tableWidget.rowCount()
            else :
                self.on_qline_edit()          
     
        def returnSRID(self, row, col):
            #Selection d'une ligne via double clique
            column = col or 1
            srid_selected = self.tableWidget.item(row, column).text()
            self.main.selected = srid_selected
     
        def on_qline_edit(self):
            #récupère le texte entré
            self.text = self.lineEdit.text()
            self.lineEdit.cursorWordForward(True)
     
            #Recherche des elements entrés dans le QlineEdit dans le QTableWidget
            if not self.lineEdit.text()=="":
                items = self.tableWidget.findItems(self.lineEdit.text(), QtCore.Qt.MatchContains) # Qt::MatchRegExp ou Qt::MatchWrap
                if items:
                    #Récupère les élements de la recherche
                    self.data_ligne=[]
                    self.data_col=[]
                    self.data_seach =[]
                    for item in items :
                        row = item.row() +1
                        self.data_ligne.append(self.tableWidget.item(item.row(), item.column()).text())
                        self.data_col.append(self.tableWidget.item(item.row(), item.column()+1).text())
                    #Elements de la recherche
                    self.data_seach={'A':self.data_ligne, 'B':self.data_col}
     
                    #Remplissage du tableau avec les résultats de la recherche rapide
                    self.tableWidget.setRowCount(len(self.data_ligne))
                    self.tableWidget.setColumnCount(len(self.data_seach))
                    self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
                    n=0
                    for key in self.data_seach:
                        print 'On table chnage data : ' , key
                        m = 0
                        for item in self.data_seach[key]:
                            self.item = QtGui.QTableWidgetItem(item)
                            print 'on table change item: ' ,self.item
                            self.tableWidget.setItem(m, n, self.item)
                            m += 1
                        n += 1
     
     
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QDialog()
        ui = Ui_Srid()
        sys.exit(app.exec_())
    Mes problèmes sont :
    1)Mon tableau change lorsque j'écris. J'aimerais qu'il change lorsque j'éfface un caractère dans ma qlineEdit également. Pour le moment, je fait cela :
    J'efface toute la qligneEdit et je fait entré. Le tableau reviens à sont état initiale.
    3) Lorsque je lance le code avec des valeurs aléatoires, il marche comme je souhaite . Lorsque je le remplis avec ma table postgresql (6000 lignes). Le code bug car il n'est pas assez performants vue le nombre de données à traiter. Il fait planter toute l'application et je dois redemarrer python.
    Il y a t-il quelque chose à faire pour que le code run sans problème ? Des astuces pour le rentre utilisable ?

    Merci d'avance pour vôtre aide !

  3. #3
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Le signal textChanged() transmet le nouveau texte, y compris s'il est vide.

    Donc tu peux faire plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def on_qline_edit(self, text):
            if text:
                items = self.tableWidget.findItems(text, QtCore.Qt.MatchContains)

    Pour ta base de donnée qui plante, tu as un message d'erreur ? Que se passe-t-il exactement ?

  4. #4
    Membre du Club
    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
    Points : 59
    Points
    59
    Par défaut
    Bonjour VinsS,

    Donc tu peux faire plus simplement:
    Code :
    def on_qline_edit(self, text):
    if text:
    items = self.tableWidget.findItems(text, QtCore.Qt.MatchContains)
    Merci, je vais voir cela. Ca me parait en effet mieux.

    Pour la base donnée, j'ai juste python ne répond pas et je suis obligé de tous fermer.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/04/2007, 19h20
  2. [C#] Changement d'item dans la comboBox
    Par cyllix dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/06/2006, 09h12
  3. Recherche d'un item dans un combobox
    Par Remedy dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/06/2006, 10h35
  4. [VB.NET] Recherche d'item dans ComboBox
    Par arno2000 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/12/2005, 14h07
  5. recherche d'un item dans une ClistCtrl
    Par ledaker dans le forum MFC
    Réponses: 1
    Dernier message: 05/12/2005, 17h01

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