一、QSqlQueryModel概述
QSqlQueryModel
用于在 QSqlQuery
返回的结果集上提供只读访问。相比 QStandardItemModel
,QSqlQueryModel
直接与数据库交互,所以更加高效。QSqlQueryModel
可以看成是库中“标准化”的模型类,对于只需要读取数据的 GUI 组件(例如 QTableView
、QListView
等等),使用 QSqlQueryModel
更加简单方便。QSqlQueryModel
继承于 QAbstractTableModel
类。
二、QSqlQueryModel的使用
下面是一个简单的使用 QSqlQueryModel
的例子:
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT name, address FROM contacts");
QTableView *view = new QTableView;
view->setModel(model);
view->show();
以上代码创建了一个 QSqlQueryModel
并设置其查询语句为 "SELECT name, address FROM contacts"
,然后将其绑定到一个 QTableView
。最后通过 show
函数展示出来。
三、QSqlQueryModel的常用函数
1、setQuery函数
setQuery
函数用于设置查询语句,一般情况下,查询语句可以直接写在函数中,如下所示:
model->setQuery("SELECT name, address FROM contacts");
除此之外,setQuery
还可以传递一个 QSqlQuery
对象作为参数,如下所示:
QSqlQuery query("SELECT name, address FROM contacts");
model->setQuery(query);
2、data函数
data
函数用于提供不同单元格的数据。在实现此函数时,可以使用父类的 data
函数实现一部分,也可以重写整个函数。下面是一个重写 data
函数的例子:
QVariant BookTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole)
return QVariant();
if (index.column() == 1)
return "Book title"; // 将第二列的数据全都设为“Book title”
return QSqlQueryModel::data(index, role);
}
3、setHeaderData函数
setHeaderData
函数用于设置表头的数据,如果没有设置,则默认使用查询结果的列名。下面是一个设置表头的例子:
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Address"));
该示例代码将第一列的表头命名为 "Name"
,第二列的表头命名为 "Address"
。
4、record函数
record
函数返回一个 QSqlRecord
对象,该对象代表了查询结果的一个记录:
QSqlRecord record = model->record(0);
QString name = record.value("name").toString(); // 获取第一条记录的name字段
5、rowCount函数和columnCount函数
rowCount
函数和 columnCount
函数分别返回了查询结果返回的行数和列数:
int rows = model->rowCount();
int cols = model->columnCount();
四、QSqlQueryModel的优缺点
1、优点
QSqlQueryModel
与数据库直接交互,效率相比 QStandardItemModel
更高;使用方便,常用的函数都已经实现,开发效率高。
2、缺点
QSqlQueryModel
只能进行只读操作,如果需要进行修改,只能通过 QSqlTableModel
或 QSqlRelationalTableModel
实现,而这两个类要设置主键才能进行更改操作;默认情况下,QSqlQueryModel
根据查询结果的列名作为表头,如果列名含义不明确,则需要通过 setHeaderData
函数手动设置表头。
五、总结
QSqlQueryModel
是 Qt 库中一个用于在 QSqlQuery
结果集上提供只读访问的模型类。其相比 QStandardItemModel
更加高效,常用的函数都已实现,使用方便。但是,QSqlQueryModel
只能进行只读操作,且默认情况下表头使用查询结果的列名,对于含义不明确的列名需要手动设置。