[增刪改查] 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();
}