QSqlQueryModel Class

QSqlQueryModel 类为 SQL 结果集提供只读数据模型。更多

Header: #include <QSqlQueryModel>
CMake.QSqlQueryModel 类 find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
继承: QAbstractTableModel
继承于:

QSqlTableModel

公共函数

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.

返回指定的itemrole 的值。

如果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.

Returns the header data for the givenrole in thesection of the header with the specifiedorientation.

另请参阅 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).

column 位置向模型中插入count 列。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() 返回新的查询。

另请参阅 query() 和setQuery()。

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() 常量。

返回模型的角色名称。

Qt 仅为QSqlQueryModel 定义了一个角色:

Qt 角色QML 角色名称
Qt::DisplayRole显示

[override virtual] int QSqlQueryModel::rowCount(const QModelIndex &parent = QModelIndex()) const

重实现:QAbstractItemModel::rowCount(const QModelIndex &parent) 常量。

如果数据库支持返回查询的大小(请参阅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 ),这将非常有用。

如果orientationQt::Horizontalsection 指向一个有效的部分,则返回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() 获取详细资料。

注意: 调用 setQuery() 会删除已插入的列。

此函数在 Qt 6.2 中引入。

另请参阅 query()、QSqlQuery::isActive()、QSqlQuery::setForwardOnly() 和lastError()。

void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())

这是一个重载函数。

为给定的数据库连接db 执行查询query 。如果未指定数据库(或数据库无效),则使用默认连接。

lastError如果查询设置出错,可使用 () 获取详细资料。

示例

QSqlQueryModelmodel; model.setQuery("select * from MyTable");if(model.lastError().isValid())    qDebug() << model.lastError();

另请参见 query()、queryChange() 和lastError()。

© 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.