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

Posted

技术标签:

【中文标题】PyQt4:我的数据库显示空单元格【英文标题】:PyQt4: My database displays empty cells 【发布时间】:2010-06-08 12:56:00 【问题描述】:

我正在使用 pyqt4 框架为数据库表单做一些显示。不幸的是,我在尝试按姓氏过滤和显示我的数据库时遇到了麻烦。假设数据库连接正常。还假设我的 tupleHeader 中有正确数量的项目,因为我对其他方法使用相同的 initializeModel 方法(例如下面描述的 search() 函数,它工作正常。

我调用了 display() 函数,它工作得很好,但是当从 sourceModel 创建 proxyModel 并尝试使用我的搜索函数显示 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) )之后加入这个,它会显示表格,即使它确实发送了错误:

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

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

感谢您花时间搜索此编码错误/错误,祝您狩猎愉快!

【问题讨论】:

【参考方案1】:

虽然我找不到问题的解决方案,但它自己解决了。我不确定,但我认为是这段代码 sn-p 使它起作用。

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

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

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

【讨论】:

以上是关于PyQt4:我的数据库显示空单元格的主要内容,如果未能解决你的问题,请参考以下文章

找到 JTable 单元格并绘制它

如何处理 UiTableviewCell 文本字段?

带有空单元格的表格视图

为啥我的数据表单元格返回空值?

如何将 QLineEdit 放入 QTableView 单元格 PyQt4?

如何在 MS Access 2010 中的单元格中显示空值