警告

本部分包含从C++自动翻译成Python的代码片段,可能包含错误。

以表格视图形式呈现数据#

../_images/relationaltable1.png

以下例子创建了一个基于SQL数据模型的视图

view = QTableView()
view.setModel(model)
view.show()
view = QTableView()
view.setModel(model)

如果模型是读/写模型(例如,《QSqlTableModel》),则视图允许用户编辑字段。您可以通过调用以下命令禁用此功能

view.setEditTriggers(QAbstractItemView.NoEditTriggers)

您可以使用同一个模型作为多个视图的数据源。如果用户通过其中一个视图编辑了模型,则其他视图将立即反映这些更改。《TableModel》示例展示了它是如何工作的。

视图类会在顶部显示一个表头以对列进行标注。要更改表头文本,请在模型上调用 setHeaderData()。默认情况下,表头的标签是表的字段名。例如

model.setHeaderData(0, Qt.Horizontal, QObject.tr("ID"))
model.setHeaderData(1, Qt.Horizontal, QObject.tr("Name"))
model.setHeaderData(2, Qt.Horizontal, QObject.tr("City"))
model.setHeaderData(3, Qt.Horizontal, QObject.tr("Country"))

../_images/insertrowinmodelview.png

同样,如果您使用 removeRows() 移除行,行将被感叹号 (!) 标记,直到更改被提交。

QSqlTableModel 专门针对单个表进行优化。如果您需要一个适用于任意查询结果集的读写模型,您可以扩展 QSqlQueryModel ,并重新实现 flags() 和 setData() 函数来使其成为读写型。以下是两个使查询模型中的字段 1 和 2 可编辑的函数:

Qt.ItemFlags EditableSqlModel.flags(
        QModelIndex index)

    Qt.ItemFlags flags = QSqlQueryModel.flags(index)
    if index.column() == 1 or index.column() == 2:
        flags |= Qt.ItemIsEditable
    return flags

def setData(self, QModelIndex index, QVariant value, int /* role */):

    if index.column() < 1 or index.column() > 2:
        return False
    primaryKeyIndex = QSqlQueryModel.index(index.row(), 0)
    id = data(primaryKeyIndex).toInt()
    clear()
    ok = bool()
    if index.column() == 1:
        ok = setFirstName(id, value.toString())
    else:
        ok = setLastName(id, value.toString())

    refresh()
    return ok

辅助函数 setFirstName() 定义如下:

def setFirstName(self, int personId, QString firstName):

    query = QSqlQuery()
    query.prepare("update person set firstname = ? where id = ?")
    query.addBindValue(firstName)
    query.addBindValue(personId)
    return query.exec()

setLastName() 函数与此类似。请参阅 Query Model 示例以获取完整的源代码。

扩展一个模型让您可以以多种方式定制它:您可以提供工具提示、更改背景颜色、提供计算值、提供查看和编辑的不同值、特殊处理空值等。请参阅模型/视图编程以及 QAbstractItemView 的引用文档以获取详细信息。

如果您的需求仅仅是把外键转换成更易于理解的字符串,您可以使用 QSqlRelationalTableModel 。为了获得最佳效果,您也应该使用 QSqlRelationalDelegate ,它提供外键的可编辑下拉选中框。

../_images/relationaltable1.png

关系型表模型 示例说明如何结合使用 QSqlRelationalTableModelQSqlRelationalDelegate 来为支持外键的表格提供功能。