編寫好編輯的接口函數后,在數據庫操作文件中調用:
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();
}
}
編輯了表格,再點擊提交,下次運行程序時,可以看到數據已經被修改了。如果我們編輯了表格后,又不想提交,就可以點擊撤銷按鍵,所有修改了的數據就會恢復回未編輯之前的狀態。如果想要刪除某一行數據,點擊刪除選中行,就可以刪除了。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
SQL
+關注
關注
1文章
789瀏覽量
46697 -
數據庫
+關注
關注
7文章
4019瀏覽量
68339
發布評論請先 登錄
相關推薦
熱點推薦
數據庫系統是什么?數據庫系統概念之數據庫設計資料免費下載
什么是概念結構設計1.將需求分析得到的用戶需求抽象為信息結構即概念模型的過程就是概念結構設計2.概念結構是各種數據模型的共同基礎,它比
發表于 09-07 14:34
?1次下載
如何使用PowerDesigner進行數據庫靜態結構設計?詳細資料概述
把用戶需求抽象為概念模型即為概念結構設計。
概念模型除了要求能反映客觀世界并且易于理解外,還要求其易于向數據模型(如關系模型)轉化。
概念模型獨立于具體的數據庫系統,是整個數據庫設
發表于 09-13 17:05
?0次下載
數據庫教程之如何進行數據庫設計
本文檔的主要內容詳細介紹的是數據庫教程之如何進行數據庫設計內容包括了:1 數據庫設計概述 ,2 數據庫需求分析 ,3 數據庫
發表于 10-19 10:41
?21次下載
數據庫設計的七大知識點總結詳細資料免費下載
本文檔的主要內容詳細介紹的是數據庫設計的七大知識點總結包括了:1 數據庫設計概述2 需求分析3 概念結構設計4 邏輯結構設計5 數據庫的物理
發表于 10-19 10:41
?0次下載
數據庫學習入門資料之數據庫的概念結構詳細資料概述
什么是概念結構設計
將需求分析得到的用戶需求抽象為信息結構即概念模型的過程就是概念結構設計
概念結構是各種數據模型的共同基礎,它比
發表于 10-25 16:29
?0次下載
數據庫概念結構是如何設計的概念結構設計資料概述
本文檔的主要內容詳細介紹的是數據庫概念結構是如何設計的概念結構設計資料概述主要內容包括了:1 概念結構2 概念結構設計的方法與步驟3
發表于 10-26 11:49
?22次下載
數據庫的設計概念總結
本文檔的主要內容詳細介紹的是數據庫的設計概念總結主要內容包括了:1.數據庫設計概述,2.需求分析,3.概念結構設計,4.邏輯結構設計,5.數據庫
發表于 01-09 17:29
?13次下載
數據庫設計開發案例教程之數據庫設計的資料介紹
本文檔的主要內容詳細介紹的是數據庫設計開發案例教程之數據庫設計的資料介紹主要內容包括了:1 數據庫設計概述,2 需求分析,3 概念結構設計,4 邏輯
發表于 01-11 11:20
?17次下載
Qt學習筆記之數據庫結構設計1
數據庫也是應用程序的重要部分,一個完整的應用程序幾乎都包含數據庫。
當前主流的數據庫有DB2、MYSQL、OCI、ODBC、SQLITE、TDS、Oracle。
Sqlite是一款輕型的
Qt學習筆記之數據庫結構設計2
數據庫也是應用程序的重要部分,一個完整的應用程序幾乎都包含數據庫。
當前主流的數據庫有DB2、MYSQL、OCI、ODBC、SQLITE、TDS、Oracle。
Sqlite是一款輕型的
Qt學習筆記之數據庫結構設計6
評論