Eu estou usando o framework PyQt4 fazer alguns monitores para formulários de banco de dados. Infelizmente, eu atingiu um problema ao tentar filtrar e mostrar o meu banco de dados por sobrenome. Suponha que a conexão de banco de dados funciona. Também assumem que eu tenho a quantidade correta de artigos em minha tupleHeader desde que eu usar o mesmo método initializeModel para outros métodos (como a função de pesquisa () descrito abaixo, e ele funciona bem.
Eu chamo a função display () e ele funciona perfeitamente bem, mas quando a criação de um proxyModel do SourceModel, e tentando mostrar o proxyModel com a minha função de pesquisa, eu tenho células vazias exibido. Quando eu restrinjo a minha busca para que ele filtra a metade do meu banco de dados, isso mostra que muitas células (por isso a maior parte desta está trabalhando). Mas não vai mostrar nada do próprio banco de dados.
Abaixo está alguns dos meus códigos:
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: Eu não estou interessado em manter este pedaço de código, eu só quero saber por que ele permite que a tabela para mostrar o conteúdo da tabela em vez de um grupo de células vazias
print self.proxyModel.filterAcceptsRow(2, self.sourceModel)
Além disso, se você colocar nesse após a última instrução (self.view.setModel (proxyModel)), ele irá mostrar a mesa, mesmo que não enviar um erro:
self.proxyModel.filterAcceptsRow impressão (2, self.sourceModel) TypeError: QSortFilterProxyModel.filterAcceptsRow (int, QModelIndex): argumento 2 tem tipo inesperado 'QSqlTableModel'
Não importa quais são os argumentos ou se eu usar filterAcceptsRow ro filterAcceptsColumn, ele exibe a tabela. Será que isso reduzir o problema algum?
Obrigado pelo seu tempo à procura de esta codificação de erro / bug, e caça feliz!