PyQt4: Meine Datenbank zeigt leere Zellen

stimmen
48

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!

Veröffentlicht am 08/06/2010 um 11:56
vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Während ich die Lösung für mein Problem finden konnte, es löste sich. Ich bin nicht sicher, aber ich denke, es ist dieser Code-Schnipsel war, dass es Arbeit gemacht.

self.dbmanip = CoreDB(self.userTableView, self.table)

Dies wurde innerhalb des setupUi () -Methode von der Qt4 Designer erstellt setzen. Ich denke, dass entweder die dbmanip, die die Tableview verlor die Informationen aus dem proxyModel enthalten ist, oder (wahrscheinlicher), ich habe die falsche Tabelle zwischen dem proxyModel und dem ursprünglichen Modell (die den proxyModel erstellt) Bezug genommen wird, und dann konnte nicht angezeigt werden, da es wurde die Zellstruktur aus einer Tabelle aufrufen und die aktuellen Informationen von einem anderen.

Dies alles sind jedoch Vermutungen. Dennoch Problem gelöst.

Beantwortet am 10/06/2010 um 12:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more