QSqlQueryModel 类

The QSqlQueryModel class provides a read-only data model for SQL result sets. 更多...

头文件 #include <QSqlQueryModel>
CMakefind_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmakeQT += sql
继承 QAbstractTableModel
继承自

QSqlTableModel

公共函数

QSqlQueryModel(QObject *parent = nullptr)
virtual~QSqlQueryModel()
virtual voidclear()
QSqlErrorlastError() const
const QSqlQuery &query() const
QSqlRecordrecord(int row) const
QSqlRecordrecord() const
(since 6.2) voidsetQuery(QSqlQuery &&query)
voidsetQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())

重写公共函数

virtual boolcanFetchMore(const QModelIndex &parent = QModelIndex()) const override
virtual intcolumnCount(const QModelIndex &index = QModelIndex()) const override
virtual QVariantdata(const QModelIndex &item, int role = Qt::DisplayRole) const override
virtual voidfetchMore(const QModelIndex &parent = QModelIndex()) override
virtual QVariantheaderData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual boolinsertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual boolremoveColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual QHash<int, QByteArray>roleNames() const override
virtual introwCount(const QModelIndex &parent = QModelIndex()) const override
virtual boolsetHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override

保护函数

virtual QModelIndexindexInQuery(const QModelIndex &item) const
virtual voidqueryChange()
voidsetLastError(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()。

另请参阅QSqlTableModelQSqlRelationalTableModelQSqlQuery模型/视图编程查询模型示例

成员函数文档

[ 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()

清除模型并释放任何已获得的资源。

[覆盖虚函数] int QSqlQueryModel::columnCount(const QModelIndex &index = QModelIndex()) const

重实现: QAbstractItemModel::columnCount(const QModelIndex &parent) const.

[覆盖虚函数] QVariant QSqlQueryModel::data(const QModelIndex &item, int role = Qt::DisplayRole) const

重实现: QAbstractItemModel::data(const QModelIndex &index, int role) const.

返回指定 itemrole 的值。

如果 item 超出范围或有错误发生,则返回无效的 QVariant

另请参阅lastError().

[覆盖虚函数] void QSqlQueryModel::fetchMore(const QModelIndex &parent = QModelIndex())

重实现: QAbstractItemModel::fetchMore(const QModelIndex &parent).

从数据库中获取更多行。这仅影响不报告查询大小的数据库(见 QSqlDriver::hasFeature()).

要强制获取整个结果集,可以使用以下方法

while (myModel->canFetchMore())
    myModel->fetchMore();

parent 应始终是一个无效的 QModelIndex

另请参阅canFetchMore().

[覆盖虚函数] QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

重实现: QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const.

返回特定 role 在具有指定 orientation 的标题 section 中的标题数据。

另请参阅setHeaderData().

[虚保护] QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex &item) const

返回模型中给定 item 的数据库结果集中值的索引。

如果没有任何列或行被插入、删除或移动,则返回值与 item 相同。

如果 item 超出范围或 item 指向的不是结果集中的值,则返回无效的模型索引。

另请参阅QSqlTableModel::indexInQuery(),insertColumns() 和 removeColumns().

[覆盖虚函数] bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())

重实现: QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent).

count 栏目插入到模型的 column 位置。必须始终要使用一个无效的 QModelIndex 作为 parent 参数,因为模型不支持父子关系。

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

返回与该模型关联的 const QSqlQuery 对象的引用。

另请参阅 setQuery().

[虚拟保护] void QSqlQueryModel::queryChange()

每当查询更改时,都会调用此虚拟函数。默认实现不执行任何操作。

query() 返回新的查询。

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

QSqlRecord QSqlQueryModel::record(int row) const

返回包含当前查询字段信息的记录。如果 row 是有效行的索引,则记录将包含该行的值。

如果模型未初始化,则返回一个空记录。

另请参阅 QSqlRecord::isEmpty().

QSqlRecord QSqlQueryModel::record() const

这是一个重载的函数。

返回一个包含当前查询字段信息的空记录。

如果模型未初始化,则返回一个空记录。

另请参阅 QSqlRecord::isEmpty().

[重载虚拟] bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

重写了: QAbstractItemModel::removeColumns(int column, int count, const QModelIndex &parent).

从位置 column 开始移除模型中的 count 列。必须始终要使用一个无效的 QModelIndex 作为 parent 参数,因为模型不支持父子关系。

移除列实际上隐藏了它们。它不会影响底层的 QSqlQuery

如果移除了列,则返回 true;否则返回 false

[重写虚拟] QHash<int, QByteArray> QSqlQueryModel::roleNames() const

重写了: QAbstractItemModel::roleNames() const.

返回模型的角色名称。

Qt 仅为 QSqlQueryModel 定义了一个角色

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

[覆盖虚函数] int QSqlQueryModel::rowCount(const QModelIndex &parent = QModelIndex()) const

重实现了: QAbstractItemModel::rowCount(const QModelIndex &parent) const

如果数据库支持返回查询的大小(参见 QSqlDriver::hasFeature()),则返回当前查询的行数。否则,返回客户端当前缓存的行数。

parent 应始终是一个无效的 QModelIndex

另请参阅canFetchMore() 和 QSqlDriver::hasFeature

[覆盖虚函数] 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)。

将指定 角色 的水平表头标题设置为 。如果模型用于显示视图中的数据(例如,QTableView),则此功能非常有用。

如果 orientationQt::Horizontalsection 指向有效的部分,则返回 true;否则返回 false

请注意,由于模型为只读,无法使用此函数修改数据库中的值。

另请参阅headerData() 和 data

[保护函数] void QSqlQueryModel::setLastError(const QSqlError &error)

允许派生类设置发生在数据库上的最后错误值的保护函数。

另请参阅lastError().

[自 6.2 版本起] void QSqlQueryModel::setQuery(QSqlQuery &&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

© 2024 Qt公司有限公司。本文件中包含的文档贡献为各自所有者的版权。所提供的文档是根据自由软件基金会发布的GNU自由文档许可证1.3版本的条款授权的。Qt及其相应标志是芬兰和/或其他国家/地区的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。