可以认为,模型是就像是人的灵魂,与”视图“的外表相同。只不过这个灵魂是虚的
视图一般使用QTableView来显示数据。
sql的模型类,与前面执行语句的效果相同,只是更加地方便地显示与操作数据库。使不懂sql语句的同学也能使用数据库。
下图是执行结果,上面的数据表是QSqlQueryModel的结果,不可编辑,而下面的表是QSqlTableModel的结果,可编辑提交
第一部分,只读模型QSqlQueryModel:
if(db.open())
{
qDebug()<<"打开成功";
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT * FROM tb_books");
model->setHeaderData(0, Qt::Horizontal, tr("isbn"));
model->setHeaderData(1, Qt::Horizontal, tr("book_name"));
model->setHeaderData(2, Qt::Horizontal, tr("price"));
QTableView *view = new QTableView(this);
view->setModel(model);
view->show();
QString book_name= model->record(1).value("book_name").toString();//返回第一行字段为book_name的项
}
我们构建一个QSqlQueryModel 实例model,设置它的查询语句,然后用setHeaderData设置模型表格的水平标题,然后让它显示到QTableView中。
对于这个模型,我们可以使用它的record或data函数来访问其中的数据,它们的原型如下:
QSqlRecord record(int row) const
virtual QVariant data(const QModelIndex & item, int role = Qt::DisplayRole) const
第二部分,读写表格模型QSqlTableModel
QSqlTableModel *model = new QSqlTableModel(this);
model->setTable("tb_books");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setFilter("isbn=4");
model->select();
model->setHeaderData(0, Qt::Horizontal, tr("isbn"));
model->setHeaderData(1, Qt::Horizontal, tr("book_name"));
model->setHeaderData(2, Qt::Horizontal, tr("price"));
QTableView *view = new QTableView(this);
view->setModel(model);
view->hideColumn(0); // don't show the ID
view->show();
QSqlTableModel与QSqlQueryModel有很大的不同,QSqlTableModel是在连接数据库后,用setTable函数设置要使用的表格的,setFilter设置过滤器,括号中是sql中的where语句省略后where后的部分,再用select()函数执行查询。然后setEditStrategy设置“编辑策略”,可用的方式如下:
Constant | Value | Description |
---|---|---|
QSqlTableModel::OnFieldChange | 0 | 所有变更实时更新到数据库 |
QSqlTableModel::OnRowChange | 1 | 用户选择另一行时,应用当前行的变更 |
QSqlTableModel::OnManualSubmit | 2 | 手动提交,不自动提交 |
QSqlTableModel有几个操作函数:
insertRecord();insertRow();insertRows();
removeRow(); removeRows();removeColumns();
revertAll();
可用于插入,删除,及提交所有更改。可见,这个模型基本拥有sql语句的大多功能
相关源码在http://pan.baidu.com/s/1tHLbf