0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Qt學(xué)習(xí)筆記之?dāng)?shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)6

jf_78858299 ? 來源:紛紜雜談 ? 作者:CY_CHEN ? 2023-02-17 13:57 ? 次閱讀

編寫好編輯的接口函數(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)擊刪除選中行,就可以刪除了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    751

    瀏覽量

    43986
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3737

    瀏覽量

    64173
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)庫系統(tǒng)是什么?數(shù)據(jù)庫系統(tǒng)概念數(shù)據(jù)庫設(shè)計(jì)資料免費(fèi)下載

      什么是概念結(jié)構(gòu)設(shè)計(jì)1.將需求分析得到的用戶需求抽象為信息結(jié)構(gòu)即概念模型的過程就是概念結(jié)構(gòu)設(shè)計(jì)2.概念結(jié)構(gòu)是各種數(shù)據(jù)模型的共同基礎(chǔ),它比
    發(fā)表于 09-07 14:34 ?1次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>系統(tǒng)是什么?<b class='flag-5'>數(shù)據(jù)庫</b>系統(tǒng)概念<b class='flag-5'>之</b><b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)資料免費(fèi)下載

    如何進(jìn)行數(shù)據(jù)庫設(shè)計(jì)?數(shù)據(jù)庫設(shè)計(jì)介紹和需求分析及結(jié)構(gòu)設(shè)計(jì)資料概述

    數(shù)據(jù)庫設(shè)計(jì)的任務(wù)是指根據(jù)需求研制數(shù)據(jù)庫結(jié)構(gòu)并應(yīng)用 數(shù)據(jù)庫的過程。數(shù)據(jù)庫設(shè)計(jì)內(nèi)容包括數(shù)據(jù)庫
    發(fā)表于 09-13 17:05 ?0次下載
    如何進(jìn)行<b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)?<b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)介紹和需求分析及<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>資料概述

    如何使用PowerDesigner進(jìn)行數(shù)據(jù)庫靜態(tài)結(jié)構(gòu)設(shè)計(jì)?詳細(xì)資料概述

    把用戶需求抽象為概念模型即為概念結(jié)構(gòu)設(shè)計(jì)。 概念模型除了要求能反映客觀世界并且易于理解外,還要求其易于向數(shù)據(jù)模型(如關(guān)系模型)轉(zhuǎn)化。 概念模型獨(dú)立于具體的數(shù)據(jù)庫系統(tǒng),是整個(gè)數(shù)據(jù)庫設(shè)
    發(fā)表于 09-13 17:05 ?0次下載
    如何使用PowerDesigner進(jìn)行<b class='flag-5'>數(shù)據(jù)庫</b>靜態(tài)<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>?詳細(xì)資料概述

    數(shù)據(jù)庫系統(tǒng)如何進(jìn)行設(shè)計(jì)?詳細(xì)方法資料概述

    設(shè)計(jì)。許多科學(xué)家認(rèn)為數(shù)據(jù)庫設(shè)計(jì)應(yīng)分6個(gè)階段進(jìn)行:需求分析、概念結(jié)構(gòu)設(shè)計(jì)、邏輯結(jié)構(gòu)設(shè)計(jì)、物理結(jié)構(gòu)設(shè)計(jì)數(shù)據(jù)
    發(fā)表于 09-26 15:15 ?12次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>系統(tǒng)如何進(jìn)行設(shè)計(jì)?詳細(xì)方法資料概述

    數(shù)據(jù)庫靜態(tài)結(jié)構(gòu)如何設(shè)計(jì)?詳細(xì)資料任務(wù)和方法說明

    任務(wù):實(shí)現(xiàn)數(shù)據(jù)庫設(shè)計(jì)新奧爾良方法中概念結(jié)構(gòu)設(shè)計(jì)和邏輯結(jié)構(gòu)設(shè)計(jì)
    發(fā)表于 09-27 15:32 ?1次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>靜態(tài)<b class='flag-5'>結(jié)構(gòu)</b>如何設(shè)計(jì)?詳細(xì)資料任務(wù)和方法說明

    數(shù)據(jù)庫教程之如何進(jìn)行數(shù)據(jù)庫設(shè)計(jì)

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫教程之如何進(jìn)行數(shù)據(jù)庫設(shè)計(jì)內(nèi)容包括了:1 數(shù)據(jù)庫設(shè)計(jì)概述 ,2 數(shù)據(jù)庫需求分析 ,3 數(shù)據(jù)庫
    發(fā)表于 10-19 10:41 ?21次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>教程之如何進(jìn)行<b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)

    數(shù)據(jù)庫設(shè)計(jì)的七大知識(shí)點(diǎn)總結(jié)詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫設(shè)計(jì)的七大知識(shí)點(diǎn)總結(jié)包括了:1 數(shù)據(jù)庫設(shè)計(jì)概述2 需求分析3 概念結(jié)構(gòu)設(shè)計(jì)4 邏輯結(jié)構(gòu)設(shè)計(jì)5 數(shù)據(jù)庫的物理
    發(fā)表于 10-19 10:41 ?0次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)的七大知識(shí)點(diǎn)總結(jié)詳細(xì)資料免費(fèi)下載

    數(shù)據(jù)庫學(xué)習(xí)入門資料數(shù)據(jù)庫的概念結(jié)構(gòu)詳細(xì)資料概述

    什么是概念結(jié)構(gòu)設(shè)計(jì) 將需求分析得到的用戶需求抽象為信息結(jié)構(gòu)即概念模型的過程就是概念結(jié)構(gòu)設(shè)計(jì) 概念結(jié)構(gòu)是各種數(shù)據(jù)模型的共同基礎(chǔ),它比
    發(fā)表于 10-25 16:29 ?0次下載
    <b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>學(xué)習(xí)</b>入門資料<b class='flag-5'>之</b><b class='flag-5'>數(shù)據(jù)庫</b>的概念<b class='flag-5'>結(jié)構(gòu)</b>詳細(xì)資料概述

    數(shù)據(jù)庫概念結(jié)構(gòu)是如何設(shè)計(jì)的概念結(jié)構(gòu)設(shè)計(jì)資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫概念結(jié)構(gòu)是如何設(shè)計(jì)的概念結(jié)構(gòu)設(shè)計(jì)資料概述主要內(nèi)容包括了:1 概念結(jié)構(gòu)2 概念結(jié)構(gòu)設(shè)計(jì)的方法與步驟3
    發(fā)表于 10-26 11:49 ?22次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>概念<b class='flag-5'>結(jié)構(gòu)</b>是如何設(shè)計(jì)的概念<b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>資料概述

    數(shù)據(jù)庫的設(shè)計(jì)概念總結(jié)

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫的設(shè)計(jì)概念總結(jié)主要內(nèi)容包括了:1.數(shù)據(jù)庫設(shè)計(jì)概述,2.需求分析,3.概念結(jié)構(gòu)設(shè)計(jì),4.邏輯結(jié)構(gòu)設(shè)計(jì),5.數(shù)據(jù)庫
    發(fā)表于 01-09 17:29 ?13次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>的設(shè)計(jì)概念總結(jié)

    數(shù)據(jù)庫設(shè)計(jì)開發(fā)案例教程之數(shù)據(jù)庫設(shè)計(jì)的資料介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)據(jù)庫設(shè)計(jì)開發(fā)案例教程之數(shù)據(jù)庫設(shè)計(jì)的資料介紹主要內(nèi)容包括了:1 數(shù)據(jù)庫設(shè)計(jì)概述,2 需求分析,3 概念結(jié)構(gòu)設(shè)計(jì),4 邏輯
    發(fā)表于 01-11 11:20 ?17次下載
    <b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)開發(fā)案例教程之<b class='flag-5'>數(shù)據(jù)庫</b>設(shè)計(jì)的資料介紹

    Qt學(xué)習(xí)筆記數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)1

    數(shù)據(jù)庫也是應(yīng)用程序的重要部分,一個(gè)完整的應(yīng)用程序幾乎都包含數(shù)據(jù)庫。 當(dāng)前主流的數(shù)據(jù)庫有DB2、MYSQL、OCI、ODBC、SQLITE、TDS、Oracle。 Sqlite是一款輕型的
    的頭像 發(fā)表于 02-17 11:25 ?710次閱讀
    <b class='flag-5'>Qt</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>1

    Qt學(xué)習(xí)筆記數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)2

    數(shù)據(jù)庫也是應(yīng)用程序的重要部分,一個(gè)完整的應(yīng)用程序幾乎都包含數(shù)據(jù)庫。 當(dāng)前主流的數(shù)據(jù)庫有DB2、MYSQL、OCI、ODBC、SQLITE、TDS、Oracle。 Sqlite是一款輕型的
    的頭像 發(fā)表于 02-17 11:25 ?495次閱讀
    <b class='flag-5'>Qt</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>2

    Qt學(xué)習(xí)筆記數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)5

    Qt中,Qt為SQL數(shù)據(jù)庫提供支持的基本模塊。Qt SQL的API分為不同的層: ·驅(qū)動(dòng)層 ·SQL API層 ·用戶接口層
    的頭像 發(fā)表于 02-17 13:56 ?741次閱讀
    <b class='flag-5'>Qt</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>5

    Qt學(xué)習(xí)筆記數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)7

    Qt中,Qt為SQL數(shù)據(jù)庫提供支持的基本模塊。Qt SQL的API分為不同的層: ·驅(qū)動(dòng)層 ·SQL API層 ·用戶接口層
    的頭像 發(fā)表于 02-17 13:57 ?495次閱讀
    <b class='flag-5'>Qt</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>數(shù)據(jù)庫</b><b class='flag-5'>結(jié)構(gòu)設(shè)計(jì)</b>7