在表视图中显示数据
QSqlQueryModel 、QSqlTableModel 和QSqlRelationalTableModel 类可用作 Qt 的视图类(如QListView 、QTableView 和QTreeView )的数据源。在实践中,QTableView 是迄今为止最常见的选择,因为 SQL 结果集本质上是一个二维数据结构。
下面的示例根据 SQL 数据模型创建了一个视图:
QTableView *view = new QTableView; view->setModel(model); view->show();
如果模型是读写模型(如QSqlTableModel ),视图将允许用户编辑字段。您可以通过调用
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
您可以将同一模型用作多个视图的数据源。如果用户通过其中一个视图编辑模型,其他视图将立即反映更改。表模型示例展示了它是如何工作的。
视图类在顶部显示一个标题来标注列。要更改页眉文本,请在模型上调用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"));
QTableView 也在左侧有一个垂直标题,用数字标识行。如果使用 () 以编程方式插入行,在使用 () 提交之前,或在用户移动到另一条记录时(假设 是 )自动提交之前,新行都将标有星号 (*)。QSqlTableModel::insertRows submitAll edit strategy QSqlTableModel::OnRowChange
同样,如果使用removeRows() 删除记录,在提交更改之前,这些记录将用感叹号(!)标记。
视图中的项目是通过委托呈现的。默认委托QStyledItemDelegate 处理最常见的数据类型(int
,QString, QImage 等)。当用户开始编辑视图中的项目时,委托还负责提供编辑器部件(如组合框)。您可以通过子类化QAbstractItemDelegate 或QStyledItemDelegate 来创建自己的委托。更多信息请参见模型/视图编程。
QSqlTableModel 我们已对 "delegate "进行了优化,使其一次只能对一个表进行操作。如果需要对任意结果集进行操作的读写模型,可以子类化 并重新实现 () 和 () 使其成为读写模型。以下两个函数可以编辑查询模型的字段 1 和 2:QSqlQueryModel flags setData
Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = QSqlQueryModel::flags(index); if (index.column() == 1 || index.column() == 2) flags |= Qt::ItemIsEditable; return flags; } bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */) { if (index.column() < 1 || index.column() > 2) return false; QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0); int id = data(primaryKeyIndex).toInt(); clear(); bool ok; if (index.column() == 1) ok = setFirstName(id, value.toString()); else ok = setLastName(id, value.toString()); refresh(); return ok; }
setFirstName() 辅助函数定义如下:
bool EditableSqlModel::setFirstName(int personId, const QString &firstName) { QSqlQuery query; query.prepare("update person set firstname = ? where id = ?"); query.addBindValue(firstName); query.addBindValue(personId); return query.exec(); }
setLastName() 函数与之类似。完整源代码请参见查询模型示例。
通过对模型进行子类化,可以以多种方式对其进行自定义:您可以为项目提供工具提示、更改背景颜色、提供计算值、为查看和编辑提供不同的值、特别处理空值等。详情请参见模型/视图编程以及QAbstractItemView 参考文档。
如果你只需要将外键解析为更人性化的字符串,可以使用QSqlRelationalTableModel 。为了达到最佳效果,还应该使用QSqlRelationalDelegate ,这是一个提供组合框编辑器的委托,用于编辑外键。
关系表模型示例说明了如何将QSqlRelationalTableModel 与QSqlRelationalDelegate 结合使用,以提供支持外键的表。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.