QSqlQueryModel Class
描述
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字段。由于工资是第二列(或列索引1),我们可以将最后一行重写如下:
int salary = model.data(model.index(4, 1)).toInt();
默认情况下,该模型是只读的。要使其读写,必须对其进行子类化并重新实现setData()和flags()。另一种选择是使用QSqlTableModel,它提供了一个基于单个数据库表的读写模型。
querymodel示例说明了如何使用QSqlQueryModel来显示查询的结果。它还展示了如何在向用户显示数据之前对QSqlQueryModel进行子类化以自定义数据的内容,以及如何基于QSqlQueryModel创建读写模型。
如果数据库没有返回查询中所选行的数量,则模型将递增地获取行。
成员函数文档
bool QSqlQueryModel::canFetchMore(const QModelIndex &parent = QModelIndex())
//如果有更多数据可供父级使用,则返回true;否则返回false。
//默认实现总是返回false。
void QSqlQueryModel::clear()
//清除模型并释放任何获取的资源。int QSqlQueryModel::columnCount(const QModelIndex &index = QModelIndex())
//返回指定的列数
QVariant QSqlQueryModel::data(const QModelIndex &item, int role = Qt::DisplayRole)
//返回指定项和角色的值。
//若项目超出界限或发生错误,则返回无效的QVariant。
void QSqlQueryModel::fetchMore(const QModelIndex &parent = QModelIndex())
//从数据库中获取更多行。
QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole)
//返回具有指定方向的标头部分中给定角色的标头数据。
QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex &item)
//返回模型中给定项的数据库结果集中值的索引。
//如果没有插入、删除或移动任何列或行,则返回值与项相同。
//如果项越界或项未指向结果集中的值,则返回无效的模型索引。
bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())
//将计数列插入模型的位置列。父参数必须始终是无效的QModelIndex,因为该模型不支持父子关系。
QSqlError QSqlQueryModel::lastError()
//返回有关数据库上发生的最后一个错误的信息。
QSqlQuery QSqlQueryModel::query()
void QSqlQueryModel::queryChange()
QSqlRecord QSqlQueryModel::record(int row)
//返回包含有关当前查询的字段信息的记录。如果行是有效行的索引,则该记录将填充该行的值。
//如果模型未初始化,将返回一条空记录。
QSqlRecord QSqlQueryModel::record()
//返回一个空记录,该记录包含有关当前查询的字段的信息。
bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
//从位置列开始从模型中删除计数列。如果列已删除,则返回true;否则返回false。
QHash<int, QByteArray> QSqlQueryModel::roleNames()
//返回模型的role名称。
int QSqlQueryModel::rowCount(const QModelIndex &parent = QModelIndex())
//如果数据库支持返回查询的大小(请参见QSqlDriver::hasFeature()),则返回当前查询的行数。否则,返回当前缓存在客户端上的行数。
bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
//将指定角色的水平标题的标题设置为值。如果模型用于在视图(例如,QTableView)中显示数据,则此选项非常有用。
//如果方向为Qt::Horizontal并且节引用了有效的节,则返回true;否则返回false。
//请注意,此函数不能用于修改数据库中的值,因为模型是只读的。
void QSqlQueryModel::setLastError(const QSqlError &error)
//受保护的函数,它允许派生类将数据库上发生的最后一个错误的值设置为error。
void QSqlQueryModel::setQuery(const QSqlQuery &query)
//重置模型并将数据提供程序设置为给定的查询。
void QSqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase())
//对给定的数据库连接数据库执行查询查询。如果未指定数据库(或无效数据库),则使用默认连接。
Example:
QSqlQueryModel model;model.setQuery("select * from MyTable");if (model.lastError().isValid())qDebug() << model.lastError();