QSqlQueryModel 类
The QSqlQueryModel class provides a read-only data model for SQL result sets. 更多...
头文件 | #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.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()
清除模型并释放任何已获得的资源。
[覆盖虚函数]
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.
返回指定 item 和 role 的值。
如果 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() 返回新的查询。
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),则此功能非常有用。
如果 orientation 是 Qt::Horizontal 且 section 指向有效的部分,则返回 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公司有限公司的商标。所有其他商标均为各自所有者的财产。