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

网友投稿 123 2024-01-26

编写好编辑的接口函数后,在数据库操作文件中调用: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 { classsqlite_sqlquerymodel_edit

; } QT_END_NAMESPACE classsqlite_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_Hsqlite_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->se

tFixedSize(QSize(this->width(),this->height())); view->setModel(model); view->show(); } sqli

te_sqlquerymodel_edit::~sqlite_sqlquerymodel_edit() { delete ui; } 运行程序,可以看到数据库表格,然后Name所在列也是可以进行修改的。

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

QSqlTableModel显示数据库:复制//QSqlTableModel model = new QSqlTableModel(this); model->setTable("staff"); model->setEditStrategy(QSqlTableModel::OnManual

Submit); //不显示第二列//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(); } } 编辑了表格,再点击提交,下次运行程序时,可以看到数据已经被修改了如果我们编辑了表格后,又不想提交,就可以点击撤销按键,所有修改了的数据就会恢复回未编辑之前的状态。

如果想要删除某一行数据,点击删除选中行,就可以删除了

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:机器视觉软件开发SDK的注意事项介绍
下一篇:Qt学习笔记之数据库结构设计7
相关文章

 发表评论

暂时没有评论,来抢沙发吧~