QSqlQueryModel Class
QSqlQueryModel 类为 SQL 结果集提供了一个只读数据模型。更多内容...
| 头文件: | #include <QSqlQueryModel> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql) target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
| 继承自: | QAbstractTableModel |
| 被继承者: |
- 所有成员列表,包括继承的成员
- 已弃用的成员
- QSqlQueryModel 属于数据库类。
公共函数
| QSqlQueryModel(QObject *parent = nullptr) | |
| virtual | ~QSqlQueryModel() |
| virtual void | clear() |
| QSqlError | lastError() const |
| const QSqlQuery & | query() const |
| QSqlRecord | record(int row) const |
| QSqlRecord | record() const |
(since 6.9) void | refresh() |
(since 6.2) void | setQuery(QSqlQuery &&query) |
| void | setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase()) |
重新实现的公共函数
| virtual bool | canFetchMore(const QModelIndex &parent = QModelIndex()) const override |
| virtual int | columnCount(const QModelIndex &index = QModelIndex()) const override |
| virtual QVariant | data(const QModelIndex &item, int role = Qt::DisplayRole) const override |
| virtual void | fetchMore(const QModelIndex &parent = QModelIndex()) override |
| virtual QVariant | headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override |
| virtual bool | insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
| virtual bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
| virtual QHash<int, QByteArray> | roleNames() const override |
| virtual int | rowCount(const QModelIndex &parent = QModelIndex()) const override |
| virtual bool | setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override |
受保护函数
| virtual QModelIndex | indexInQuery(const QModelIndex &item) const |
| virtual void | queryChange() |
| void | setLastError(const QSqlError &error) |
详细说明
QSqlQueryModel 是一个用于执行 SQL 语句并遍历结果集的高级接口。它基于底层的QSqlQuery 构建,可用于向QTableView 等视图类提供数据。例如:
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT name, salary FROM employee");
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
view->show();我们先设置模型的查询,然后配置视图标题中显示的标签。
QSqlQueryModel 还可以用于通过编程方式访问数据库,而无需将其绑定到视图:
QSqlQueryModel model;
model.setQuery("SELECT name, salary FROM employee");
int salary = model.record(4).value("salary").toInt();上面的代码片段从SELECT 查询的结果集第 4 条记录中提取了salary 字段。由于salary 是第 2 列(或列索引 1),我们可以将最后一行重写为:
int salary = model.data(model.index(4, 1)).toInt();该模型默认是只读的。若要使其成为可读写模型,必须继承该类并重写setData() 和flags() 方法。另一种选择是使用QSqlTableModel ,它提供了一个基于单个数据库表的可读写模型。
querymodel示例演示了如何使用 QSqlQueryModel 来显示查询结果。它还展示了如何通过继承 QSqlQueryModel 来在向用户显示数据之前自定义数据内容,以及如何基于 QSqlQueryModel 创建可读写模型。
如果数据库在查询中未返回所选行的行数,该模型将增量地获取行。有关更多信息,请参阅fetchMore()。
另请参阅 QSqlTableModel 、QSqlRelationalTableModel 、QSqlQuery 、模型/视图编程以及查询模型示例。
成员函数文档
[explicit] QSqlQueryModel::QSqlQueryModel(QObject *parent = nullptr)
使用给定的parent 创建一个空的QSqlQueryModel。
[virtual noexcept] QSqlQueryModel::~QSqlQueryModel()
销毁该对象并释放所有已分配的资源。
另请参阅 clear()。
[override virtual] bool QSqlQueryModel::canFetchMore(const QModelIndex &parent = QModelIndex()) const
重写:QAbstractItemModel::canFetchMore(const QModelIndex &parent) const。
如果可以从数据库中读取更多行,则返回 `true `。这仅影响那些不返回查询行数的数据库(参见 `QSqlDriver::hasFeature()`)。
parent 应始终返回一个无效的QModelIndex 。
另请参阅 fetchMore()。
[virtual] void QSqlQueryModel::clear()
清除模型并释放已获取的资源。
[override virtual] int QSqlQueryModel::columnCount(const QModelIndex &index = QModelIndex()) const
重写了:QAbstractItemModel::columnCount(const QModelIndex &parent) const。
[override virtual] QVariant QSqlQueryModel::data(const QModelIndex &item, int role = Qt::DisplayRole) const
重写:QAbstractItemModel::data(const QModelIndex &index, int role) const。
返回指定item 和role 的值。
如果item 超出范围或发生错误,则返回一个无效的QVariant 。
另请参阅 lastError()。
[override virtual] void QSqlQueryModel::fetchMore(const QModelIndex &parent = QModelIndex())
重写自:QAbstractItemModel::fetchMore(const QModelIndex &parent)。
从数据库中获取更多行。这仅影响那些不会返回查询结果大小的数据库(参见QSqlDriver::hasFeature())。
若要强制获取整个结果集,可使用以下方法:
while (myModel->canFetchMore())
myModel->fetchMore();parent 应始终为一个无效的QModelIndex 。
另请参阅 canFetchMore()。
[override virtual] QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
重写:QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const。
返回给定role 的头文件数据,该数据位于头文件的section 中,且具有指定的orientation 。
另请参阅 setHeaderData()。
[virtual protected] QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex &item) const
返回模型中给定item 在数据库结果集中的索引。
如果未插入、删除或移动任何列或行,则返回值与 `item ` 完全相同。
如果 `item ` 超出范围,或者 `item ` 未指向结果集中的某个值,则返回一个无效的模型索引。
另请参阅 QSqlTableModel::indexInQuery()、insertColumns() 和removeColumns()。
[override virtual] bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())
重写了:QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent)。
将count 列插入到模型中,位置为column 。parent 参数必须始终为无效的QModelIndex ,因为该模型不支持父子关系。
如果column 在有效范围内,则返回true ;否则返回false 。
默认情况下,插入的列为空。若要填充数据,请重写data() 并分别处理每个插入的列:
QVariant MyModel::data(const QModelIndex &item, int role) const
{
if (item.column() == m_specialColumnNo) {
// handle column separately
}
return QSqlQueryModel::data(item, role);
}另请参阅 removeColumns()。
QSqlError QSqlQueryModel::lastError() const
返回有关数据库中最近一次错误的信息。
另请参阅 setLastError() 和query()。
const QSqlQuery &QSqlQueryModel::query() const
返回与该模型关联的 constQSqlQuery 对象的引用。
另请参阅 setQuery()。
[virtual protected] void QSqlQueryModel::queryChange()
每当查询发生变化时,都会调用此虚拟函数。默认实现不执行任何操作。
query() 返回新的查询。
QSqlRecord QSqlQueryModel::record(int row) const
返回包含当前查询字段信息的记录。如果row 是有效行对应的索引,则该记录将填充该行的值。
如果模型未初始化,则返回一个空记录。
另请参阅 QSqlRecord::isEmpty()。
QSqlRecord QSqlQueryModel::record() const
返回一个包含当前查询字段信息的空记录。
如果模型未初始化,则将返回一个空记录。
这是一个重载函数。
另请参阅 QSqlRecord::isEmpty()。
[since 6.9] void QSqlQueryModel::refresh()
重新执行当前查询,从同一数据库连接中获取数据。
注意: 当查询包含绑定值时,refresh() 不适用。
该函数在 Qt 6.9 中引入。
另请参阅 setQuery(QSqlQuery &&query) 和QSqlQuery::boundValue()。
[override virtual] bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
重写了:QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent)。
从位置column 开始,从模型中移除count 列。parent 参数必须始终为无效的QModelIndex ,因为该模型不支持父子关系。
删除列实际上是将其隐藏。这不会影响底层的QSqlQuery 。
如果列已被删除,则返回true ;否则返回false 。
[override virtual] QHash<int, QByteArray> QSqlQueryModel::roleNames() const
重写:QAbstractItemModel::roleNames() const。
返回模型的角色名称。
Qt 为QSqlQueryModel 仅定义了一个角色:
| Qt 角色 | QML 角色名称 |
|---|---|
| Qt::DisplayRole | display |
[override virtual] int QSqlQueryModel::rowCount(const QModelIndex &parent = QModelIndex()) const
重写了:QAbstractItemModel::rowCount(const QModelIndex &parent) const。
如果数据库支持返回查询的大小(参见QSqlDriver::hasFeature()),则返回当前查询的行数。否则,返回客户端当前缓存的行数。
parent 应始终为一个无效的QModelIndex 。
另请参阅 canFetchMore() 和QSqlDriver::hasFeature() 函数。
[override virtual] bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
重写了:QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)。
将指定role 的水平标题设置为value 。当模型用于在视图中显示数据时(例如QTableView ),此方法非常有用。
如果orientation 为Qt::Horizontal 且section 指向一个有效的部分,则返回true ;否则返回false。
请注意,由于该模型为只读模式,此函数无法用于修改数据库中的值。
另请参阅 headerData() 和data()。
[protected] void QSqlQueryModel::setLastError(const QSqlError &error)
一个受保护的方法,允许派生类将数据库中发生的最后一个错误的值设置为error 。
另请参阅 lastError()。
[since 6.2] void QSqlQueryModel::setQuery(QSqlQuery &&query)
重置模型,并将数据提供者设置为给定的query 。请注意,该查询必须处于活动状态,且不能为isForwardOnly()。
lastError如果设置查询时发生错误,可使用 () 方法获取详细信息。
注意:调用 setQuery() 将删除所有已插入的列。
此函数在 Qt 6.2 中引入。
另请参阅 query()、QSqlQuery::isActive()、QSqlQuery::setForwardOnly() 和lastError()。
void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())
针对给定的数据库连接 `db` 执行查询 `query `。如果未指定数据库(或指定了无效的数据库),则使用默认连接。
lastError如果设置查询时发生错误,可以使用 () 获取详细信息。
示例:
QSqlQueryModel model;
model.setQuery("select * from MyTable");
if(model.lastError().isValid())
qDebug() << model.lastError();这是一个重载函数。
另请参阅 query()、queryChange 和lastError 。
© 2026 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.