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

电子说

1.3w人已加入

描述

编写好编辑的接口函数后,在数据库操作文件中调用:

sqlite_sqlquerymodel_edit.h

#ifndef SQLITE_SQLQUERYMODEL_EDIT_H
#define SQLITE_SQLQUERYMODEL_EDIT_H


#include 
#include 
#include "editquerymodel.h"
#include 
#include 


QT_BEGIN_NAMESPACE
namespace Ui { class sqlite_sqlquerymodel_edit; }
QT_END_NAMESPACE


class sqlite_sqlquerymodel_edit : public QWidget
{
    Q_OBJECT


public:
    sqlite_sqlquerymodel_edit(QWidget *parent = nullptr);
    ~sqlite_sqlquerymodel_edit();


private:
    Ui::sqlite_sqlquerymodel_edit *ui;
    QSqlDatabase db;
};
#endif // SQLITE_SQLQUERYMODEL_EDIT_H

sqlite_sqlquerymodel_edit.c

#include "sqlite_sqlquerymodel_edit.h"
#include "ui_sqlite_sqlquerymodel_edit.h"


sqlite_sqlquerymodel_edit::sqlite_sqlquerymodel_edit(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::sqlite_sqlquerymodel_edit)
{
    ui->setupUi(this);


    //1、根据数据库类型来连接数据库
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("compary.db");
    //2、打开数据库
    if(!db.open())
    {
        qDebug() << "open error" << db.lastError();
    }


    //3、根据需求,创建数据库所需要表
    QSqlQuery query;


    /***
     * 员工表:staff
     * 字段名有 id name age address salary
     * */
    QString sqlCreateTable = QString ("create table staff(id integer primary key autoincrement,"
                                      "name varchar(20),"
                                      "age int,"
                                      "address varchar(50),"
                                      "salary int);");
    if(!query.exec(sqlCreateTable))
    {
        qDebug() << "create table" << db.lastError();
    }


//    QString sqlInsert = QString("insert into staff(name,age,address,salary)"
//                                "values('张三',20,'广州市天河区',12000);");
//    if(!query.exec(sqlInsert))
//    {
//        qDebug() << "Error insert into data" << db.lastError();
//    }


    //1、创建模型对象
    editQueryModel* model = new editQueryModel;
    model->setQuery("SELECT id,name,age,address,salary FROM staff");
    model->setHeaderData(0,Qt::Horizontal,"ID");
    model->setHeaderData(1,Qt::Horizontal,"Name");
    model->setHeaderData(2,Qt::Horizontal,"Age");
    model->setHeaderData(3,Qt::Horizontal,"Address");
    model->setHeaderData(4,Qt::Horizontal,"Salary");


    //2、创建表格控件
    QTableView *view = new QTableView(ui->tableView);
    view->setFixedSize(QSize(this->width(),this->height()));
    view->setModel(model);
    view->show();
}


sqlite_sqlquerymodel_edit::~sqlite_sqlquerymodel_edit()
{
    delete ui;
}

运行程序,可以看到数据库表格,然后Name所在列也是可以进行修改的。

SQL

三、QSqlTableModel实现数据表的读写

QSqlQueryModel实现读写是通过重写虚函数实现的,需要创建模型,但是对于一般数据库的应用,是需要导出为excel来做后续的数据保存或者数据处理的,这种创建模型的方式导出excel相对QSqlTableModel来说,就没有那么方便了,因为QSqlTableModel提供了基于单个数据表的读写模型,可以很方便的进行操作。

QSqlTableModel显示数据库:

//QSqlTableModel
model = new QSqlTableModel(this);
model->setTable("staff");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//不显示第二列
//model->removeColumn(1);
//查询整张表
model->select();
ui->tableView->setModel(model);

运行程序,可以看到数据库信息已经显示在Qt页面中

SQL

整个表格的数据都是可以编辑的,但是编辑过后,在下一次运行程序时,会发现数据其实并没有被修改。所以如果想要进行编辑,需要添加另外的提交修改、撤销修改、删除当前选定行操作。

void sqlite_sqlquerymodel_edit::on_pushButton_commit_clicked()
{
    //开启事务
    model->database().transaction();
    if (model->submitAll())//提交所有更改
    {
        //提交事务
        model->database().commit();
    }
    else
    {
        //回滚事务
        model->database().rollback();
        QMessageBox::warning(this, tr("TableView"), tr("数据库错误: %1").arg(model->lastError().text()));
    }
}


void sqlite_sqlquerymodel_edit::on_pushButton_undo_clicked()
{
    model->revertAll();
}


void sqlite_sqlquerymodel_edit::on_pushButton_delete_clicked()
{
    //获取选中的行
    int curRow = ui->tableView->currentIndex().row();
    //删除该行
    model->removeRow(curRow);
    int ret = QMessageBox::warning(this, tr("删除当前行"), tr("你确定要删除该行吗"), QMessageBox::Yes | QMessageBox::No);
    if (ret == QMessageBox::Yes)
    {
        //删除该行 提交到数据库
        model->submitAll();
    }
    else
    {
        //不删除  撤销操作
        model->revertAll();
    }
}

编辑了表格,再点击提交,下次运行程序时,可以看到数据已经被修改了。如果我们编辑了表格后,又不想提交,就可以点击撤销按键,所有修改了的数据就会恢复回未编辑之前的状态。如果想要删除某一行数据,点击删除选中行,就可以删除了。

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

全部0条评论

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

×
20
完善资料,
赚取积分