电子说
编写好编辑的接口函数后,在数据库操作文件中调用:
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所在列也是可以进行修改的。
三、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页面中
整个表格的数据都是可以编辑的,但是编辑过后,在下一次运行程序时,会发现数据其实并没有被修改。所以如果想要进行编辑,需要添加另外的提交修改、撤销修改、删除当前选定行操作。
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();
}
}
编辑了表格,再点击提交,下次运行程序时,可以看到数据已经被修改了。如果我们编辑了表格后,又不想提交,就可以点击撤销按键,所有修改了的数据就会恢复回未编辑之前的状态。如果想要删除某一行数据,点击删除选中行,就可以删除了。
全部0条评论
快来发表一下你的评论吧 !