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 !