1. 程式人生 > >[增刪改查] C++ 之 Qt 連線資料庫進行圖形介面的 CRUD

[增刪改查] C++ 之 Qt 連線資料庫進行圖形介面的 CRUD

最近同學在做課程設計,要涉及到資料庫,但是有的同學接觸的語言只有C++,並沒有 java ,HTML,等語言,那麼要怎麼利用現有的C++語言的知識去做一個和資料庫有關的資訊管理系統呢?
筆者強烈建議使用 Qt Creator C++ 編譯器。

一、建立 C++ 專案工程

具體步驟可以見之前的一篇博文

二、設計 UI 介面

左邊是ui介面,右邊顯示拖放近ui介面的元件的型別、名稱、所屬類。

這裡寫圖片描述

三、編寫槽函式

槽函式和訊號的理解,可以去看之前寫過的一篇博文

右擊 右邊的 butonShow 進入槽函式,就會自動建立一個函式,類似 Java Swing程式設計裡邊的事件函式
但是比 Java Swing 程式設計還簡單
①有 ui 介面編輯器,只需要把 ui 編輯器 裡邊的元件託到介面 就可以了,實現0程式碼編寫量 設計 介面
而 Java 的Swing 程式設計 的元件要自己手寫,大小、位置 還要程式碼來控制,這是很浪費時間的無腦操作。
在 Qt 裡邊,元件一拖,以拉扯,就好了!
這裡寫圖片描述


②事件函式的編寫,自動生成一個類似下面的程式碼框架,還有很多配置都用xml幫你配置好了。
寫起來是很方便的!

void MainWindow::on_buttonShow_clicked()
{
}
void MainWindow::on_buttonShow_clicked()
{
       QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//指定為 mysql 資料庫
       db.setHostName("localhost");//本地的話固定
       db.setUserName("root"); //你的資料庫的名字
db.setPassword("123"); //你的資料庫的密碼 db.setDatabaseName("car"); //你的資料庫裡邊的一個庫名 QSqlTableModel *model = new QSqlTableModel(this); //一個數據庫表視覺化模型 model->setTable("factory"); //你指定的庫名裡邊的表名 ui->showArea->setModel(model); //顯示模型的位置 model->select(); //顯示資料庫表 }

四、效果

點選顯示汽車按鈕,就會從資料中指定的表顯示出來,是不是很簡單?!表的格式都不用設定了,
只需要一句程式碼 ui->showArea->setModel(model);

這裡寫圖片描述

當然還可以對資料進行增刪改,同樣也是幾句程式碼就可以實現了!後續有空再寫

五、無法操作資料庫

①沒有 資料連線檔案
下面這個東西網上多的是,去下載就好了,然後放到你安裝 Qt Creator 的bin路徑下
這裡寫圖片描述
② properties 配置
(每次新增新的的東西時,先編譯但是不執行,點選這裡寫圖片描述
注意這裡 QT += core gui sql 就好了,就是加上 sql 在 gui 後面

#-------------------------------------------------
#
# Project created by QtCreator ....
#
#-------------------------------------------------

QT += core gui sql

.......
 .......
 .......

六、資料庫資料增、刪、改、查(2018.4.14更新)

刪除

一、ui 設計
這裡寫圖片描述
二、效果

點選所在行,點選刪除

這裡寫圖片描述

點選確定

這裡寫圖片描述

三、核心程式碼

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
namespace Ui {
       class MainWindow;
}

class MainWindow : public QMainWindow
{
       Q_OBJECT

public:
       explicit MainWindow(QWidget *parent = 0);
       ~MainWindow();

       private slots:
       void on_buttonDel_clicked();

       void on_buttonSure_clicked();

private:
       Ui::MainWindow *ui;
       QSqlTableModel *model;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlTableModel>
#include <QSqlRecord>

MainWindow::MainWindow(QWidget *parent) :
       QMainWindow(parent),
       ui(new Ui::MainWindow)
{
       ui->setupUi(this);
       QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
       db.setHostName("localhost");
       db.setUserName("root");
       db.setPassword("123");
       db.setDatabaseName("car");
       model = new QSqlTableModel(this);
       model->setTable("factory");
       ui->tableView->setModel(model);
       model->select();
       //取消自動提交,設定為人工提交
       model->setEditStrategy(QSqlTableModel::OnManualSubmit);
}

MainWindow::~MainWindow()
{
       delete ui;
}

void MainWindow::on_buttonDel_clicked()
{
       QItemSelectionModel *sModel = ui->tableView->selectionModel();
       QModelIndexList list = sModel->selectedRows();
       for (int i = 0; i<list.size(); i++)
       {
              model->removeRow(list.at(i).row());
       }

}

void MainWindow::on_buttonSure_clicked()
{
       model->submitAll(); //提交動作
}

修改

一、ui 設計

這裡寫圖片描述

二、效果

雙擊所在行,即可進行編輯
這裡寫圖片描述
點選確定,就會同時修改資料庫的資訊
這裡寫圖片描述

三、核心程式碼

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
namespace Ui {
       class MainWindow;
}

class MainWindow : public QMainWindow
{
       Q_OBJECT

public:
       explicit MainWindow(QWidget *parent = 0);
       ~MainWindow();

       private slots:
       void on_buttonSure_clicked();

private:
       Ui::MainWindow *ui;
       QSqlTableModel *model;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlTableModel>
#include <QSqlRecord>

MainWindow::MainWindow(QWidget *parent) :
       QMainWindow(parent),
       ui(new Ui::MainWindow)
{
       ui->setupUi(this);
       QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
       db.setHostName("localhost");
       db.setUserName("root");
       db.setPassword("123");
       db.setDatabaseName("car");
       model = new QSqlTableModel(this);
       model->setTable("factory");
       ui->tableView->setModel(model);
       model->select();
       //取消自動提交,設定為人工提交
       model->setEditStrategy(QSqlTableModel::OnManualSubmit);
}

MainWindow::~MainWindow()
{
       delete ui;
}

void MainWindow::on_buttonSure_clicked()
{
       model->submitAll();
}

新增

一、ui 設計

這裡寫圖片描述

二、效果

點選新增,即出現新的一行

這裡寫圖片描述
填寫 name 即可,點選確定,自動生成 di=5
這裡寫圖片描述
資料庫的資訊
這裡寫圖片描述

三、核心程式碼

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
namespace Ui {
       class MainWindow;
}

class MainWindow : public QMainWindow
{
       Q_OBJECT

public:
       explicit MainWindow(QWidget *parent = 0);
       ~MainWindow();

       private slots:
       void on_buttonSure_clicked();

       void on_buttonNew_clicked();

private:
       Ui::MainWindow *ui;
       QSqlTableModel *model;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlTableModel>
#include <QSqlRecord>

MainWindow::MainWindow(QWidget *parent) :
       QMainWindow(parent),
       ui(new Ui::MainWindow)
{
       ui->setupUi(this);

       QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
       db.setHostName("localhost");
       db.setUserName("root");
       db.setPassword("123");
       db.setDatabaseName("car");
       model = new QSqlTableModel(this);
       model->setTable("factory");
       ui->tableView->setModel(model);
       model->select();
       //取消自動提交,設定為人工提交
       model->setEditStrategy(QSqlTableModel::OnManualSubmit);
}

MainWindow::~MainWindow()
{
       delete ui;
}

void MainWindow::on_buttonSure_clicked()
{
       model->submitAll();
}

void MainWindow::on_buttonNew_clicked()
{
       QSqlRecord record = model->record();
       int row = model->rowCount();
       model->insertRecord(row, record);
}

查詢

一、ui 設計

這裡寫圖片描述

二、效果

輸入 id=23 點選確定,即可查到對應的一條記錄

這裡寫圖片描述

三、核心程式碼

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSqlTableModel>
namespace Ui {
       class MainWindow;
}

class MainWindow : public QMainWindow
{
       Q_OBJECT

public:
       explicit MainWindow(QWidget *parent = 0);
       ~MainWindow();

       private slots:
       void on_buttonCheck_clicked();

private:
       Ui::MainWindow *ui;
       QSqlTableModel *model;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlTableModel>
#include <QSqlRecord>

MainWindow::MainWindow(QWidget *parent) :
       QMainWindow(parent),
       ui(new Ui::MainWindow)
{
       ui->setupUi(this);

       QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
       db.setHostName("localhost");
       db.setUserName("root");
       db.setPassword("123");
       db.setDatabaseName("car");
       model = new QSqlTableModel(this);
       model->setTable("factory");
       ui->tableView->setModel(model);
       model->select();
       //取消自動提交,設定為人工提交
       model->setEditStrategy(QSqlTableModel::OnManualSubmit);
}

MainWindow::~MainWindow()
{
       delete ui;
}

void MainWindow::on_buttonCheck_clicked()
{
       QString id = ui->lineId->text();
       QString str = QString("id='%1'").arg(id);
       model->setFilter(str);
       model->select();
}