PyQt4:我的数据库显示为空单元格

1 投票
1 回答
525 浏览
提问于 2025-04-15 23:41

我正在使用pyqt4框架来展示数据库表单。可惜的是,在尝试通过姓氏来过滤和显示我的数据库时遇到了一些问题。假设数据库连接是正常的,也假设我的元组头部(tupleHeader)里的项目数量是正确的,因为我在其他方法(比如下面提到的search()函数)中使用了相同的initializeModel方法,并且它运行得很好。

我调用display()函数时一切正常,但在从源模型(sourceModel)创建代理模型(proxyModel)并尝试用我的搜索函数显示代理模型时,出现了空白单元格。当我限制搜索条件,过滤掉一半的数据库时,能显示出相应数量的单元格(所以大部分功能是正常的)。但就是无法显示数据库里的任何内容。

以下是我的部分代码:

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))后面加上这行代码,它会显示表格,尽管会报错:

print self.proxyModel.filterAcceptsRow(2, self.sourceModel) TypeError: QSortFilterProxyModel.filterAcceptsRow(int, QModelIndex): argument 2 has unexpected type 'QSqlTableModel'

无论我使用filterAcceptsRow还是filterAcceptsColumn,参数是什么,它都能显示表格。这是否能帮助缩小问题范围呢?

感谢你花时间来寻找这个编码错误/bug,祝你好运!

1 个回答

0

虽然我没有找到解决我问题的方法,但它自己解决了。我不太确定,但我觉得是这段代码让它工作起来了。

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

这段代码放在了Qt4 Designer创建的SetupUi()方法里面。我觉得可能是包含TableView的dbmanip丢失了来自proxyModel的信息,或者(更有可能的是)我可能在proxyModel和原始Model之间引用了错误的表格,导致无法显示,因为它从一个表格调用了单元格结构,而实际信息却来自另一个表格。

不过这些都是猜测。总之,问题解决了。

撰写回答