详细描述
QSqlQueryModel 类为SQL结果集提供了一个只读的数据模型。
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 * FROM employee");
int salary = model.record(4).value("salary").toInt();
上面的代码片段从查询(SELECT * from employee)的结果集中的记录4(第4行)提取了salary(薪水)字段。假设salary(工资)是第二列,则以上代码片段可修改为:
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
int salary = model.data(model.index(4, 2)).toInt();
该模型默认为只读的。为了使它能够读写,你必须子类化该类并重新实现setData()和flags().另一个选择是使用 QSqlTableModel类,它提供了基于单个数据库表的读写模型。
Query Model Example(可在Qt帮助文档中搜索该demo,后续文章将会讲解这个例子)示例演示了如何使用QSqlQueryModel来显示查询的结果。它还展示了如何对QSqlQueryModel进行子类化,以便在向用户显示数据之前对数据内容进行定制,以及如何创建基于QSqlQueryModel的读写模型。
如果数据库没有返回查询选择的行数,该模型将增量地获取行。更多信息,参阅 fetchMore() API的描述。
相关API
QSqlQueryModel::QSqlQueryModel(QObject * parent = 0)
使用给定的parent创建一个空的QSqlQueryModel 对象。
QSqlQueryModel::~QSqlQueryModel() [virtual]
销毁对象并释放任何已分配的资源。
bool QSqlQueryModel::canFetchMore(const QModelIndex & parent = QModelIndex()) const [virtual]
重新实现 QAbstractItemModel::canFetchMore()。
如果可以从数据库获取更多行返回true。这只会影响不报告查询大小的数据库。参数parent应该始终是一个无效的QModelIndex。
void QSqlQueryModel::clear() [virtual]
清除模型并释放任何已经获得的资源。
int QSqlQueryModel::columnCount(const QModelIndex & index = QModelIndex()) const [virtual]
重新实现QAbstractItemModel::columnCount()获取模型的列数。
QVariant QSqlQueryModel::data(const QModelIndex & item, int role = Qt::DisplayRole) const [virtual]
重新实现 QAbstractItemModel::data()。
返回制定item(项)和role(角色)的值。
如果item超出范围或者如果遇到错误,返回一个无效的 QVariant。
void QSqlQueryModel::fetchMore(const QModelIndex & parent = QModelIndex()) [virtual]
重新实现 QAbstractItemModel::fetchMore()。
从数据库中获取更多的行。这只影响不报告查询大小的数据库。
为了强制获得整个结果集,你可以使用以下代码:
while (myModel->canFetchMore())
myModel->fetchMore();
参数parent应该始终是无效的 QModelIndex。
QVariant QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const [virtual]
重新实现QAbstractItemModel::headerData()。
将给定角色的头数据返回到标题中指定位置的指定方向。
QModelIndex QSqlQueryModel::indexInQuery(const QModelIndex & item) const [virtual protected]
返回模型中给定项(item)的数据库结果集中的值得索引。
如果没有插入、删除或移动的行或列,返回值和参数item相等。
如果item超出边界或者项目没有指向结果集中的值则返回一个无效的模型索引。
bool QSqlQueryModel::insertColumns(int column, int count, const QModelIndex & parent = QModelIndex()) [virtual]
重新实现QAbstractItemModel::insertColumns()。
在模型的位置column处插入count列。parent参数始终是无效的QModelIndex,因为模型不支持父子关系。
如果列在边界内则返回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);
}
QSqlError QSqlQueryModel::lastError() const
返回数据库中发生的最后一条错误信息。
QSqlQuery QSqlQueryModel::query() const
返回与此模型关联的 QSqlQuery。
void QSqlQueryModel::queryChange() [virtual protected]
这个虚函数在查询query更改时被调用。默认实现什么都没做。
query()返回新的查询对象。
QSqlRecord QSqlQueryModel::record(int row) const
返回包含当前查询字段信息的记录。如果行是一个有效行的索引,则记录将从该行开始填充值。如果模型未初始化,将返回空记录。
QSqlRecord QSqlQueryModel::record() const
这是一个重载函数。
返回包含当前查询字段信息的一条空记录。如果模型未初始化,将会返回一条空记录。
bool QSqlQueryModel::removeColumns(int column, int count, const QModelIndex & parent = QModelIndex()) [virtual]
重新实现QAbstractItemModel::removeColumns()。
从模型的位置column处开始移除count列。参数parent始终是无效的 QModelIndex,因为模型不支持父子关系。
removeColumns()(删除列)有效地隐藏了它们。它不影响底层的 QSqlQuery。
如果指定列被成功删除返回true;否则返回false。
int QSqlQueryModel::rowCount(const QModelIndex & parent = QModelIndex()) const [virtual]
重新实现 QAbstractItemModel::rowCount()。
如果数据库支持返回查询的大小,则返回当前查询的行数。否则,返回当前在客户机上缓存的行数。
参数parent始终是一个无效的 QModelIndex。
bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant & value, int role = Qt::EditRole) [virtual]
重新实现QAbstractItemModel::setHeaderData()。
设置指定角色的水平表头的标题为value。如果模型用于在视图中(例如: QTableView)显示数据,这将很有用。
如果参数orientation(方向)是 Qt::Horizontal(水平的)并且参数section(部分)指向一个有效地部分则返回true;否则返回false。
注意该函数不能用于修改数据库里面的值,因为该模型是只读的。
void QSqlQueryModel::setLastError(const QSqlError & error) [protected]
受保护的函数允许派生类设置数据库中发生的最后一条错误的值为参数error。
void QSqlQueryModel::setQuery(const QSqlQuery & query)
重新设置模型并将数据提供者设置为给定的查询query。注意查询query必须是活跃的(active)并且一定不能是isForwardOnly()。
如果查询出现错误可以使用lastError()检索详细的信息。
注意:调用setQuery()将删除任何插入的列。
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();