編寫好編輯的接口函數(shù)后,在數(shù)據(jù)庫操作文件中調(diào)用:
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、根據(jù)數(shù)據(jù)庫類型來連接數(shù)據(jù)庫
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("compary.db");
//2、打開數(shù)據(jù)庫
if(!db.open())
{
qDebug() << "open error" << db.lastError();
}
//3、根據(jù)需求,創(chuàng)建數(shù)據(jù)庫所需要表
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,'廣州市天河區(qū)',12000);");
// if(!query.exec(sqlInsert))
// {
// qDebug() << "Error insert into data" << db.lastError();
// }
//1、創(chuàng)建模型對(duì)象
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、創(chuàng)建表格控件
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;
}
運(yùn)行程序,可以看到數(shù)據(jù)庫表格,然后Name所在列也是可以進(jìn)行修改的。
三、QSqlTableModel實(shí)現(xiàn)數(shù)據(jù)表的讀寫
QSqlQueryModel實(shí)現(xiàn)讀寫是通過重寫虛函數(shù)實(shí)現(xiàn)的,需要?jiǎng)?chuàng)建模型,但是對(duì)于一般數(shù)據(jù)庫的應(yīng)用,是需要導(dǎo)出為excel來做后續(xù)的數(shù)據(jù)保存或者數(shù)據(jù)處理的,這種創(chuàng)建模型的方式導(dǎo)出excel相對(duì)QSqlTableModel來說,就沒有那么方便了,因?yàn)镼SqlTableModel提供了基于單個(gè)數(shù)據(jù)表的讀寫模型,可以很方便的進(jìn)行操作。
QSqlTableModel顯示數(shù)據(jù)庫:
//QSqlTableModel
model = new QSqlTableModel(this);
model->setTable("staff");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//不顯示第二列
//model->removeColumn(1);
//查詢整張表
model->select();
ui->tableView->setModel(model);
運(yùn)行程序,可以看到數(shù)據(jù)庫信息已經(jīng)顯示在Qt頁面中
整個(gè)表格的數(shù)據(jù)都是可以編輯的,但是編輯過后,在下一次運(yùn)行程序時(shí),會(huì)發(fā)現(xiàn)數(shù)據(jù)其實(shí)并沒有被修改。所以如果想要進(jìn)行編輯,需要添加另外的提交修改、撤銷修改、刪除當(dāng)前選定行操作。
void sqlite_sqlquerymodel_edit::on_pushButton_commit_clicked()
{
//開啟事務(wù)
model->database().transaction();
if (model->submitAll())//提交所有更改
{
//提交事務(wù)
model->database().commit();
}
else
{
//回滾事務(wù)
model->database().rollback();
QMessageBox::warning(this, tr("TableView"), tr("數(shù)據(jù)庫錯(cuò)誤: %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("刪除當(dāng)前行"), tr("你確定要?jiǎng)h除該行嗎"), QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::Yes)
{
//刪除該行 提交到數(shù)據(jù)庫
model->submitAll();
}
else
{
//不刪除 撤銷操作
model->revertAll();
}
}
編輯了表格,再點(diǎn)擊提交,下次運(yùn)行程序時(shí),可以看到數(shù)據(jù)已經(jīng)被修改了。如果我們編輯了表格后,又不想提交,就可以點(diǎn)擊撤銷按鍵,所有修改了的數(shù)據(jù)就會(huì)恢復(fù)回未編輯之前的狀態(tài)。如果想要?jiǎng)h除某一行數(shù)據(jù),點(diǎn)擊刪除選中行,就可以刪除了。
-
SQL
+關(guān)注
關(guān)注
1文章
751瀏覽量
43986 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
3737瀏覽量
64173
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論