PyQt4: Meu banco de dados mostra células vazias

votos
48

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!

Publicado 08/06/2010 em 11:56
usuário
Em outras línguas...                            


1 respostas

votos
0

Enquanto eu não poderia encontrar a solução para o meu problema, resolveu-se. Não estou certo, mas eu acho que foi esse trecho de código que fez o trabalho.

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

Este foi colocado dentro do método setupUi () criado pelo Designer Qt4. Eu acho que tanto o dbmanip que continha a TableView perdeu as informações do proxyModel, ou (mais provável), I pode ter referenciado a mesa errada entre o proxyModel e do modelo original (que criou o proxyModel), e então não poderia exibir porque ele estava chamando a estrutura da célula de uma tabela e as informações reais da outra.

Estas são todas as suposições embora. Ainda assim, problema resolvido.

Respondeu 10/06/2010 em 12:15
fonte usuário

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