Qt学习笔记之数据库结构设计5

电子说

1.3w人已加入

描述

一、QSqlQueryModel模型基本使用

//使用QSqlQueryModel来高效地查询数据库操作
//1、创建QSqlQueryModel对象,并设置相关的表头信息
QSqlQueryModel* model = new QSqlQueryModel;
//执行sql语句,将查询出来的结果转换成model对象
model->setQuery("select name ,age,address,salary from staff");
//根据需求设置表头信息
model->setHeaderData(0,Qt::Horizontal,"Name");
model->setHeaderData(1,Qt::Horizontal,"Age");
model->setHeaderData(2,Qt::Horizontal,"Address");
model->setHeaderData(3,Qt::Horizontal,"Salary");
//给ui控件设置一个模型
QTableView* view = new QTableView(ui->tableView);


view->setFixedSize(QSize(this->width(),this->height()));
view->setModel(model);//相当于将数据联动到UI控件上


//将view显示
view->show();

运行后,页面就可以显示出数据库表格相关信息了。

SQL

二、QSqlQueryModel可编辑接口重写

默认情况下,QSqlQueryModel模型是只读的。要使它具有可读写性,必须继承它并重新实现setData()和flags()。另一种选择是使用QSqlTableModel,它提供了基于单个数据表的读写模型。

接口一:

[virtual]bool setData(const QModelIndex &index,const QVariant &value,int role = Qt::EditRole)

接口二:

[override virtual]Qt::ItemFlags flags(const QModelIndex &index)const

创建一个新的类用于编辑

editquerymodel.h

#ifndef EDITQUERYMODEL_H
#define EDITQUERYMODEL_H
#include 
#include 


class editQueryModel : public QSqlQueryModel
{
public:
    editQueryModel();


    //重写基类的虚函数
    bool setData(const QModelIndex &index,const QVariant &value,int role = Qt::EditRole);
    Qt::ItemFlags flags(const QModelIndex &index)const;


private:
    //自定义接口函数
    //更新数据
    void refresh();


    //根据需求来定义修改表中的内容的接口
    bool setName(int useId,const QString& name);
};


#endif // EDITQUERYMODEL_H

editquerymodel.c

#include "editquerymodel.h"


editQueryModel::editQueryModel()
{


}


bool editQueryModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    //1、判断是否为有效列    员工表--id 用户名 年龄 地址 薪资
    if(index.column() < 1 || index.column() > 4)
        return false;


    //获取列所对应的id
    QModelIndex prinmaryIndex = QSqlQueryModel::index(index.row(),0);
    int id = this->data(prinmaryIndex).toInt();


    //在修改行时,将数据清除,把整个model清空
    this->clear();
    bool ok;
    //根据需求修改所对应的列
    if(index.column() == 1)
    {
        ok = setName(id,value.toString());
    }


    //刷新数据
    refresh();


    return ok;
}


Qt::ItemFlags editQueryModel::flags(const QModelIndex &index) const
{
    //1、获取当前单元格的编辑状态
    Qt::ItemFlags flag = QSqlQueryModel::flags(index);


    //2、给现有的标志增加一个可编辑的标志
//    if(index.column()==1)
    flag = flag | Qt::ItemIsEditable;//给它设置一个可编辑的状态


    return flag;
}


void editQueryModel::refresh()
{
    //相当于将数据库的数据查询出来,转换成一个model
    this->setQuery("select * from staff");
    this->setHeaderData(0,Qt::Horizontal,"ID");
    this->setHeaderData(1,Qt::Horizontal,"Name");
    this->setHeaderData(2,Qt::Horizontal,"Age");
    this->setHeaderData(3,Qt::Horizontal,"Address");
    this->setHeaderData(4,Qt::Horizontal,"Salary");
}


bool editQueryModel::setName(int useId, const QString &name)
{
    //相当于一个刷新的操作
    QSqlQuery query;


    query.prepare("update staff set name = ? where id = ?");


    query.addBindValue(name);
    query.addBindValue(useId);
    return query.exec();
}
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分