编写好编辑的接口函数后,在数据库操作文件中调用:
sqlite_sqlquerymodel_edit.h
#ifndef sqlite_sqlquerymodel_edit_h#define sqlite_sqlquerymodel_edit_h#include #include #include editquerymodel.h#include #include qt_begin_namespacenamespace ui { class sqlite_sqlquerymodel_edit; }qt_end_namespaceclass sqlite_sqlquerymodel_edit : public qwidget{ q_objectpublic: sqlite_sqlquerymodel_edit(qwidget *parent = nullptr); ~sqlite_sqlquerymodel_edit();private: ui::sqlite_sqlquerymodel_edit *ui; qsqldatabase db;};#endif // sqlite_sqlquerymodel_edit_hsqlite_sqlquerymodel_edit.c
#include sqlite_sqlquerymodel_edit.h#include ui_sqlite_sqlquerymodel_edit.hsqlite_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
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所在列也是可以进行修改的。
三、qsqltablemodel实现数据表的读写
qsqlquerymodel实现读写是通过重写虚函数实现的,需要创建模型,但是对于一般数据库的应用,是需要导出为excel来做后续的数据保存或者数据处理的,这种创建模型的方式导出excel相对qsqltablemodel来说,就没有那么方便了,因为qsqltablemodel提供了基于单个数据表的读写模型,可以很方便的进行操作。
qsqltablemodel显示数据库:
//qsqltablemodelmodel = new qsqltablemodel(this);model->settable(staff);model->seteditstrategy(qsqltablemodel::onmanualsubmit);//不显示第二列//model->removecolumn(1);//查询整张表model->select();ui->tableview->setmodel(model);运行程序,可以看到数据库信息已经显示在qt页面中
整个表格的数据都是可以编辑的,但是编辑过后,在下一次运行程序时,会发现数据其实并没有被修改。所以如果想要进行编辑,需要添加另外的提交修改、撤销修改、删除当前选定行操作。
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(); }}编辑了表格,再点击提交,下次运行程序时,可以看到数据已经被修改了。如果我们编辑了表格后,又不想提交,就可以点击撤销按键,所有修改了的数据就会恢复回未编辑之前的状态。如果想要删除某一行数据,点击删除选中行,就可以删除了。
AMT-DO300智能型溶解氧传感器的工作原理
单通道声音定位硬件电路设计原理图解析
荣耀9什么时候上市?荣耀9最新消息:荣耀9采用金属中框,双玻璃镜面,取消3.5mm耳机孔
嵌入式片上存储器有效使用的方法
获百万订单,牵手地平线、英伟达!禾赛科技深凿激光雷达“护城河”
Qt学习笔记之数据库结构设计6
富信电子FRM系列阻贴片电阻满足广大工业控制和汽车电子客户需求
一文简介什么是5G CPE
基于物联网的电梯故障监测怎样设计实现
电流传感器IC相关问题解答
行业方案|建材行业SRM供应商管理解决方案
自5G商用的脚步临近,产业链对于PCB的需求开始迅速增长
大众汽车将从第二季度开始将ChatGPT整合到其汽车中
比特币风暴即将来临,史上最动荡时期,生死存亡需严阵以待
5G物联网课题组赴中山市物联网协会调研
用晶面工程方法设计具有高容量和快速电化学动力学的MOF基电极
MCU芯片研发商灵动微电子完成战略融资
AirPower和AirPods能否亮相苹果秋季新品发布会
如何做一条合格的path?同一条path在物理设计不同阶段的变化
Core i7-10700 3DMark跑分曝光 性能与锐龙7 3700X同级