PyQt4: Il mio database mostra le celle vuote

voti
48

Sto usando il quadro PyQt4 per fare alcuni monitor per forme di database. Purtroppo, mi ha colpito un intoppo durante il tentativo di filtrare e visualizzare la mia base di dati in base al cognome. Si supponga che la connessione al database funziona. assumere anche che ho la giusta quantità di elementi a mio tupleHeader dato che io uso lo stesso metodo initializeModel per altri metodi (come la funzione di ricerca () descritto qui di seguito, e funziona benissimo.

Ho chiamare la funzione di visualizzazione () e funziona perfettamente bene, ma quando si crea un proxyModel dal sourceModel, e cercando di visualizzare il proxyModel con la mia funzione di ricerca, ho celle vuote visualizzate. Quando limito la ricerca in modo che filtra metà del mio database, si dimostra che molte cellule (quindi la maggior parte di questo sta lavorando). Ma non visualizzerà nulla dal database stesso.

Di seguito alcune del mio codice:

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: Io non sono interessato a mantenere questo pezzo di codice, voglio solo sapere perché permette al tavolo per visualizzare il contenuto della tabella invece di un gruppo di celle vuote

print self.proxyModel.filterAcceptsRow(2, self.sourceModel)

Inoltre, se si mette in questo dopo l'ultima istruzione (self.view.setModel (proxyModel)), mostrerà al tavolo, anche se non inviare un errore:

stampa self.proxyModel.filterAcceptsRow (2, self.sourceModel) TypeError: QSortFilterProxyModel.filterAcceptsRow (int, QModelIndex): argomento 2 ha Tipo inaspettato 'QSqlTableModel'

Non importa ciò che gli argomenti sono o se io uso filterAcceptsRow ro filterAcceptsColumn, visualizza la tabella. Questo circoscrivere il problema un po '?

Grazie per il vostro tempo alla ricerca di questo errore di codificazione / bug, e la caccia felice!

È pubblicato 08/06/2010 alle 11:56
dall'utente
In altre lingue...                            


1 risposte

voti
0

Mentre io non riuscivo a trovare la soluzione al mio problema, si risolto. Io non sono sicuro, ma credo che fosse questo frammento di codice che ha reso il lavoro.

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

Questo è stato messo all'interno del metodo setupUi () creato dal designer Qt4. Credo che sia il dbmanip che conteneva il TableView perso le informazioni dal proxyModel, o (più probabilmente), forse ho fatto riferimento al tavolo sbagliato tra la proxyModel e il modello originale (che ha creato il proxyModel), e poi non riuscivo a visualizzare perché si stava chiamando la struttura delle cellule da una tabella e le informazioni effettive da un altro.

Queste sono tutte congetture però. Ancora, problema risolto.

Risposto il 10/06/2010 a 12:15
fonte dall'utente

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