Ich bin mit dem PyQt4 Rahmen einige Displays für Datenbankformulare zu tun. Leider traf ich einen Haken bei dem Versuch, meine Datenbank nach Nachnamen zu filtern und anzuzeigen. Es sei angenommen, dass die Datenbankverbindung funktioniert. Man nehme auch an, dass ich die richtige Menge an Einzelteilen in meinem tupleHeader habe, da ich das gleiche initializeModel Verfahren für andere Methoden (wie die Suche () Funktion unten beschrieben verwenden, und es funktioniert gut.
Ich nenne die Anzeige () Funktion und es funktioniert perfekt in Ordnung, aber wenn einen proxyModel vom sourceModel zu schaffen und versuchen, die proxyModel mit meiner Suchfunktion angezeigt werden, ich habe leere Zellen angezeigt. Wenn ich meine Suche einschränken, so dass es die Hälfte meiner Datenbank filtert, zeigt es, dass viele Zellen (so die meisten dieser arbeitet). Aber es wird nichts aus der Datenbank selbst anzuzeigen.
Im Folgenden finden Sie einige meinen 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: Ich bin nicht daran interessiert, dieses Stück Code zu halten, ich möchte nur wissen, warum es die Tabelle erlaubt die Tabellen Inhalt statt einer Reihe von leeren Zellen zu zeigen,
print self.proxyModel.filterAcceptsRow(2, self.sourceModel)
Auch, wenn Sie in diese nach der letzten Anweisung (self.view.setModel (proxyModel)) setzen, wird es in der Tabelle zeigen, auch wenn er einen Fehler macht senden:
Druck self.proxyModel.filterAcceptsRow (2, self.sourceModel) Typeerror: QSortFilterProxyModel.filterAcceptsRow (int, QModelIndex): Argument 2 hat unerwartete Typ 'QSqlTableModel'
Es spielt keine Rolle, was die Argumente sind oder ob ich filterAcceptsRow ro filterAcceptsColumn verwenden, zeigt es die Tabelle. Ist verengt das Problem nach unten etwas?
Vielen Dank für Ihre Zeit für diesen Codierungsfehler / Fehler suchen und glücklich Jagd!