警告
本部分包含从C++自动翻译成Python的代码片段,可能包含错误。
以表格视图形式呈现数据#
以下例子创建了一个基于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"))
同样,如果您使用 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
,它提供外键的可编辑下拉选中框。
关系型表模型 示例说明如何结合使用 QSqlRelationalTableModel
和 QSqlRelationalDelegate
来为支持外键的表格提供功能。