2010-06-08 19 views
1

我正在使用pyqt4框架为数据库表单做一些显示。不幸的是,我在尝试按姓氏过滤和显示数据库时遇到了一些障碍。假定数据库连接起作用。另外,假设我在我的tupleHeader中有正确数量的项目,因为我对其他方法使用了相同的initializeModel方法(如下面描述的search()函数,并且它工作正常。)我调用display()函数并它工作的很好,但是当从sourceModel创建一个proxyModel,并尝试使用我的搜索功能显示proxyModel时,我显示了空单元格。当我限制搜索以便过滤一半数据库时,它显示许多单元格。所以大多数的这工作),但它不会显示数据库本身什么PyQt4:我的数据库显示空单元格

下面是我的一些代码:

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) 

编辑:我没有兴趣在保持这段代码,我只是想知道为什么它允许表以显示表的内容,而不是一堆空单元格

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

另外,如果你把在这最后的陈述(self.view.setModel(proxyModel))之后,它会显示表,即使它发送一个错误:

打印self.proxyModel.filterAcceptsRow(2 self.sourceModel) 类型错误:QSortFilterProxyModel.filterAcceptsRow(int,QModelIndex):参数2有意外的类型'QSqlTableModel'

无论参数是什么或使用filterAcceptsRow ro filterAcceptsColumn都无关紧要,它会显示表格。这是否缩小了问题的范围?

谢谢你的时间寻找这个编码错误/错误,并开心狩猎!

回答

0

尽管我无法找到解决问题的办法,但它解决了问题。我不确定,但我认为这是使它工作的这段代码片段。

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

这是放在由Qt4设计器创建的SetupUi()方法中。我认为包含TableView的dbmanip丢失了来自proxyModel的信息,或者(更可能),我可能引用了proxyModel和原始模型(创建proxyModel)之间的错误表格,然后无法显示,因为它从一个表格调用单元格结构并从另一个表格调用实际的信息。

虽然这些都是猜测。仍然,问题解决了。

相关问题