J'utilise le cadre de pyqt4 pour faire des écrans pour les formulaires de base de données. Malheureusement, je frappe un accroc en essayant de filtrer et d'afficher ma base de données par nom. On suppose que la connexion de base de données fonctionne. Supposons également que j'ai la bonne quantité d'articles dans mon tupleHeader depuis que j'utilise la même méthode initializeModel pour d'autres méthodes (comme la fonction recherche () décrite ci-dessous, et il fonctionne très bien.
J'appeler la fonction d'affichage () et il fonctionne parfaitement bien, mais lors de la création d'un proxyModel du sourceModel, et en essayant d'afficher le proxyModel avec ma fonction de recherche, je les cellules vides affichées. Quand je limiterai ma recherche afin qu'il filtre la moitié de ma base de données, il montre que de nombreuses cellules (donc la plupart de ce travaille). Mais il n'affichera rien de la base de données elle-même.
Ci-dessous est une partie de mon code:
from PyQt4 import QtGui, QtCore, QtSql
self.caseSensitivity = QtCore.Qt.CaseInsensitive
self.syntax = QtCore.QRegExp.FixedString
def initializeModel(self, model):
model.setTable(self.table)
#model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit)
b = 0
for a in self.tupleHeader:
model.setHeaderData(b, QtCore.Qt.Horizontal, QtGui.qApp.tr(a))
b += 1
model.select()
def display(self):
'''reads all row data and displays it on a tableview'''
self.connectdb(self.db, self.localhost, self.dbname, self.username, self.password)
model = QtSql.QSqlTableModel()
self.initializeModel(model)
self.view.setModel(model)
self.disconnectdb(self.db)
def search(self, searchQuery):
'''queries database data, filters it, and displays it on a tableview'''
sourceModel = QtSql.QSqlTableModel()
proxyModel = QtGui.QSortFilterProxyModel()
self.initializeModel(sourceModel)
proxyModel.setSourceModel(sourceModel) # allows to edit proxyModel without changing underying model
#searchQuery contains the last name that I am filtering with
regExp = QtCore.QRegExp(searchQuery, self.caseSensitivity, self.syntax)
proxyModel.setFilterRegExp(regExp)
proxyModel.setFilterKeyColumn(2) # this column holds the last names
# self.view contains the table itemview my application uses to display the database
self.view.setModel(proxyModel)
EDIT: Je ne suis pas intéressé à garder ce morceau de code, je veux juste savoir pourquoi il permet à la table de montrer le contenu de la table au lieu d'un groupe de cellules vides
print self.proxyModel.filterAcceptsRow(2, self.sourceModel)
En outre, si vous mettez dans ce après la dernière instruction (self.view.setModel (proxyModel)), il affichera la table, même si elle n'envoie une erreur:
impression self.proxyModel.filterAcceptsRow (2, self.sourceModel) TypeError: QSortFilterProxyModel.filterAcceptsRow (int, QModelIndex): Argument 2 a le type inattendu 'QSqlTableModel'
Peu importe ce que les arguments sont ou si j'utilise filterAcceptsRow ro filterAcceptsColumn, il affiche la table. Est-ce que l'incident en quelques-uns?
Nous vous remercions de votre temps à la recherche de cette erreur / bug de codage, et bonne chasse!