Qt模块化笔记之sql——数据库模型视图

来源:互联网 发布:mysql数据库pdf 编辑:程序博客网 时间:2024/05/21 18:44

可以认为,模型是就像是人的灵魂,与”视图“的外表相同。只不过这个灵魂是虚的

视图一般使用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函数来访问其中的数据,它们的原型如下:

QSqlRecordrecord(int row) constvirtual QVariantdata(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设置“编辑策略”,可用的方式如下:

ConstantValueDescriptionQSqlTableModel::OnFieldChange0所有变更实时更新到数据库QSqlTableModel::OnRowChange1用户选择另一行时,应用当前行的变更QSqlTableModel::OnManualSubmit2手动提交,不自动提交最后将模型在视图中显示。

QSqlTableModel有几个操作函数:

insertRecord();insertRow();insertRows();

removeRow(); removeRows();removeColumns();

revertAll();

可用于插入,删除,及提交所有更改。可见,这个模型基本拥有sql语句的大多功能


相关源码在http://pan.baidu.com/s/1tHLbf