主要是對數據庫的增刪查改的操作
登錄/注冊界面:
主頁面:?
添加信息:
刪除信息:
刪除第一行(支持多行刪除)?
需求分析:
用QT實現一個學生管理信息系統,數據庫為MySQL
要求:
- 1、要求有完整界面,如登錄界面、信息操作界面
- 2、要求有數據庫
- 3、可以錄入學生信息
- 4、可以查詢學生信息,支持模糊查詢
- 5、可以修改學生信息,支持單個和批量修改
- 6、可以刪除學生信息,支持單個和批量刪除
- 7、學生信息包括:班級、學號、姓名、性別、出生年月、專業、所屬學院
2024.11.30 bug和所需添加記錄:
- 注冊賬號時空值也會新建(已解決)
- 數據庫sql語句寫在qt上,方便運行(已解決)
- 用戶名規則,開頭字母
2024.12.6 bug記錄
- 相同賬號和不同密碼,彈出信息框錯誤(已解決)
- 代碼耦合:qt數據庫常量抽取出來(已解決)
- 添加信息后沒有刷新信息
登錄界面:
Login.h
#ifndef LOGIN_H
#define LOGIN_H#include <QWidget>
#include <QSqlDatabase> //數據庫驅動
#include <QSqlQuery> //數據庫執行語句
#include <QSqlError> //數據庫報錯
#include <QMessageBox> //消息對話框
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui {
class Login;
}
QT_END_NAMESPACEclass Login : public QWidget
{Q_OBJECTpublic:Login(QWidget *parent = nullptr);~Login();void createDataBase();private slots:void on_loginbutton_clicked();void on_registerbtn_clicked();private:Ui::Login *ui;
};
#endif // LOGIN_H
Login.cpp
#include "login.h"
#include "ui_login.h"
#include "homepage.h"
#define databaseName "qt"Login::Login(QWidget *parent): QWidget(parent), ui(new Ui::Login)
{ui->setupUi(this);//加載驅動QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("127.0.0.1"); // 主機IPdb.setUserName("root"); // 用戶名db.setPassword(""); // 密碼if (!db.open()) {qDebug() << "WARNING: " << db.lastError().text();return; // 如果連接失敗,退出函數}// qDebug() << databaseName;// 檢查數據庫 qt 是否存在QSqlQuery query;if (!query.exec("CREATE DATABASE IF NOT EXISTS " databaseName)) {qDebug() << "創建數據庫" << databaseName << "失敗:" << query.lastError().text();return; // 數據庫創建失敗,退出函數}else{qDebug() << "數據庫" << databaseName << "已存在!";}db.setDatabaseName(databaseName); // 現在切換到 qt 數據庫if (!db.open()) {qDebug() << "WARNING: 無法打開 " << databaseName << "數據庫:" << db.lastError().text();return; // 如果無法連接到 qt,退出函數}// 數據庫連接成功,繼續后續操作qDebug() << "成功創建數據庫!" << databaseName ;createDataBase();
}//sql語句創建數據庫
void Login::createDataBase() {// 創建user表的SQL語句QString createUserTable = "CREATE TABLE IF NOT EXISTS `user` (""`account` VARCHAR(20) NOT NULL, ""`pwd` VARCHAR(20) NOT NULL, ""PRIMARY KEY (`account`))";// 創建student表的SQL語句QString createStudentTable = "CREATE TABLE IF NOT EXISTS `student` (""`id` INT(5) NOT NULL, ""`name` VARCHAR(20) NOT NULL, ""`gender` VARCHAR(2) NOT NULL, ""`birthdate` VARCHAR(10) NOT NULL, ""`major` VARCHAR(20) NOT NULL, ""`class` VARCHAR(20) NOT NULL, ""`college` VARCHAR(20) NOT NULL, ""PRIMARY KEY (`id`))";// 執行創建表的SQL語句QSqlQuery query;if (query.exec(createUserTable) && query.exec(createStudentTable)) {qDebug() << "數據庫創建成功";} else {qDebug() << "數據庫創建失敗" << query.lastError().text();}}void Login::on_loginbutton_clicked() //登錄功能
{QString account = ui->account->text();QString password = ui->pwd->text();QString sql = QString("select * from user where account='%1' and pwd='%2'").arg(account).arg(password);QSqlQuery query(sql);if(query.next()){QMessageBox::information(this, "登錄認證", "登錄成功");//登錄成功后可以跳轉到主頁面HomePage *window = new HomePage();window->show();this->close(); //關閉登錄窗口}else{QMessageBox::information(this, "登錄認證", "登錄失敗,賬戶或者密碼錯誤");}// HomePage *window = new HomePage(); //測試專用// window->show();// this->close(); //關閉登錄窗口
}void Login::on_registerbtn_clicked() //注冊按鈕
{QString account = ui->account->text().trimmed();QString password = ui->pwd->text().trimmed();//判斷賬號和密碼是否為空if(account.isEmpty() || password.isEmpty()){QMessageBox::warning(this,"注冊認證","賬號或密碼不能為空!");return; //退出函數}//相同賬號,不同密碼的情況:QString sql = QString("select * from user where account='%1'").arg(account);QSqlQuery query(sql);if(query.next()){QMessageBox::warning(this,"注冊認證","賬號已存在!");return; //退出函數}//注冊賬號sql = QString("insert into user(account,pwd) values('%1','%2');").arg(account).arg(password);if(query.exec(sql)){ //表中存在該賬號和密碼QMessageBox::information(this,"注冊認證","注冊失敗!");}else{QMessageBox::information(this,"注冊認證","注冊成功!");}
}Login::~Login()
{delete ui;
}
Login.ui
學生管理信息系統界面:
HomePage.h
#ifndef HOMEPAGE_H
#define HOMEPAGE_H#include <QWidget>
#include <QSqlDatabase> //數據庫驅動
#include <QSqlQuery> //數據庫執行語句
#include <QSqlError> //數據庫報錯
#include <QMessageBox> //消息對話框
#include <QDebug>namespace Ui {
class HomePage;
}class HomePage : public QWidget
{Q_OBJECTpublic:explicit HomePage(QWidget *parent = nullptr);~HomePage();void initDatabase(); //加載數據庫驅動函數void refreshTable(QString inquiresql); //刷新表格,查詢數據庫全部內容private slots:void on_refresh_btn_clicked();void on_delete_btn_clicked();void on_inquire_btn_clicked();void on_add_btn_clicked();void on_modify_btn_clicked();private:Ui::HomePage *ui;
};#endif // HOMEPAGE_H
HomePage.cpp
#include "homepage.h"
#include "ui_homepage.h"
#include "add.h"
#include "modify.h"
#define databaseName "qt"HomePage::HomePage(QWidget *parent): QWidget(parent), ui(new Ui::HomePage)
{ui->setupUi(this);initDatabase(); //加載數據庫驅動//設置表頭QStringList headerList; //定義headerList變量headerList << "選擇欄" << "學號" << "姓名" << "性別" << "出生年月" << "專業" << "班級" << "學院"; //添加內容QFont font; //設置字號font.setPointSize(17);ui->tableWidget->setFont(font);ui->tableWidget->setColumnCount(headerList.size()); //設置列數=表頭列數ui->tableWidget->setHorizontalHeaderLabels(headerList); //添加headerList到表頭ui->tableWidget->setRowCount(3); //設置行數,不設置顯示不出文本// 設置列表自動填充滿窗口ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);// 設置輸入框提示信息為占位符文本,一旦用戶開始輸入,提示信息會消失。ui->inquire_lineEdit->setPlaceholderText("支持模糊查詢,輸入姓名或者學號關鍵詞");refreshTable(NULL);
}void HomePage::initDatabase(){ //加載數據庫驅動函數QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");db.setHostName("127.0.0.1"); // 主機IPdb.setUserName("root"); // 用戶名db.setPassword(""); // 密碼db.setDatabaseName(databaseName); // 要連接哪個數據庫,它的名字// 打開數據庫,如果打不開就彈出報錯對話框if(db.open() == false){qDebug() << "WARNING:" << db.lastError().text() << "\n";}// 打開成功qDebug() << "數據庫成功打開" << "\n";
}void HomePage::refreshTable(QString inquiresql){//先【從最后往前】刪除表格所有行for(int row = ui->tableWidget->rowCount()-1; row >= 0; row--){ui->tableWidget->removeRow(row);}QSqlQuery query;if(inquiresql.isEmpty()){QString sql = "select * from student";query.exec(sql);}else{query.exec(inquiresql);}//數據庫查詢并添加int row = 0;while(query.next()){int Old_RowCount = ui->tableWidget->rowCount(); //獲取當前表格行數ui->tableWidget->setRowCount(Old_RowCount+1); //添加一行//第一列添加復選框QTableWidgetItem *checkbox = new QTableWidgetItem();checkbox->setCheckState(Qt::Unchecked); //設置非選中狀態ui->tableWidget->setItem(row, 0, checkbox);//添加數據,未設置只讀狀態ui->tableWidget->setItem(row, 1, new QTableWidgetItem(query.value(0).toString())); // 學號ui->tableWidget->setItem(row, 2, new QTableWidgetItem(query.value(1).toString())); // 姓名ui->tableWidget->setItem(row, 3, new QTableWidgetItem(query.value(2).toString())); // 性別ui->tableWidget->setItem(row, 4, new QTableWidgetItem(query.value(3).toString())); // 出生年月ui->tableWidget->setItem(row, 5, new QTableWidgetItem(query.value(4).toString())); // 專業ui->tableWidget->setItem(row, 6, new QTableWidgetItem(query.value(5).toString())); // 班級ui->tableWidget->setItem(row, 7, new QTableWidgetItem(query.value(6).toString())); // 學院row++; //下一行}
}void HomePage::on_refresh_btn_clicked() //刷新學生信息
{QString nullString = NULL;refreshTable(nullString); //刷新表格
}void HomePage::on_delete_btn_clicked() //刪除學生信息
{QList<QString> StudentId; //存儲需要刪除的學生id//遍歷表格每一行for(int row = ui->tableWidget->rowCount()-1; row >= 0; row--){QTableWidgetItem *checkBoxItem = ui->tableWidget->item(row, 0); //讀取勾選框的列表項if(checkBoxItem->checkState() == Qt::Checked){QTableWidgetItem *idItem = ui->tableWidget->item(row, 1); //讀取id的列表項if (idItem) {StudentId.append(idItem->text());}}}//沒勾選就不刪了,退出函數if(StudentId.empty()){QMessageBox::information(this, "提示", "請先勾選需要刪除的行");return;}//構建批量刪除的SQL語句,參數化查詢防止SQL注入QString sql = "DELETE FROM student WHERE id IN (";for (int i = 0; i < StudentId.size(); i++) {sql += "?";if (i < StudentId.size() - 1)sql += ",";}sql += ")";QSqlQuery query;query.prepare(sql);for (int i = 0; i < StudentId.size(); i++) {query.addBindValue(StudentId[i]);}if(query.exec()) {QString nullString = NULL;refreshTable(nullString); //刪除成功后立即刷新表格QMessageBox::information(this, "成功", "刪除成功!");} else {QMessageBox::information(this, "失敗", "刪除失敗:" + query.lastError().text());}
}void HomePage::on_inquire_btn_clicked() //查詢信息
{QString inquireString = ui->inquire_lineEdit->text().trimmed();QString sql = QString("select id, name, gender, birthdate, major, class, college from student where id like \"%1%2\" or name like \"%3%4\"").arg(inquireString, "%", inquireString, "%");refreshTable(sql);
}void HomePage::on_add_btn_clicked() //添加信息
{int Old_RowCount = ui->tableWidget->rowCount(); //獲取當前表格行數ui->tableWidget->setRowCount(Old_RowCount+1); //添加一行add *window = new add();window->show();
}void HomePage::on_modify_btn_clicked() //根據學號修改信息
{Modify *window = new Modify();window->show();
}HomePage::~HomePage()
{delete ui;
}
HomePage.ui
添加信息界面:
add.h
#ifndef ADD_H
#define ADD_H#include <QWidget>
#include <QMessageBox> //消息對話框
#include <QDebug>
#include <QSqlDatabase> //數據庫驅動
#include <QSqlQuery> //數據庫執行語句
#include <QSqlError> //數據庫報錯namespace Ui {
class add;
}class add : public QWidget
{Q_OBJECTpublic:explicit add(QWidget *parent = nullptr);~add();private slots:void on_add_btn_clicked();private:Ui::add *ui;
};#endif // ADD_H
add.cpp
#include "add.h"
#include "ui_add.h"
#include "homepage.h"add::add(QWidget *parent): QWidget(parent), ui(new Ui::add)
{ui->setupUi(this);
}void add::on_add_btn_clicked()
{QString id = ui->id_linedit->text().trimmed();QString name = ui->name_lineEdit->text().trimmed();QString gender = ui->gender_lineEdit->text().trimmed();QString birthdate = ui->birth_lineEdit->text().trimmed();QString major = ui->major_lineEdit->text().trimmed();QString Class = ui->class_lineEdit->text().trimmed();QString college = ui->college_lineEdit->text().trimmed();//結束條件if(id.isEmpty() || name.isEmpty() || gender.isEmpty()|| birthdate.isEmpty() || major.isEmpty() || Class.isEmpty() || college.isEmpty()){QMessageBox::warning(this, "警告", "信息請填寫完整!");return;}//判斷學號是否存在,存在則結束QString sql = "select * from student where id = ?";QSqlQuery query;query.prepare(sql);query.bindValue("?", id);query.exec();if(query.next()){QMessageBox::warning(this, "警告", "學號已存在!");return;}//添加學生sql = QString("insert into student (id, name, gender, birthdate, major, class, college) values (\"%1\", \"%2\", \"%3\", \"%4\", \"%5\", \"%6\", \"%7\")").arg(id, name, gender, birthdate, major, Class, college);if(query.exec(sql)) {QMessageBox::information(this, "成功", "插入成功!");close(); //關閉窗口HomePage *homepage = new HomePage();homepage->refreshTable(NULL); //刷新表格}else {QMessageBox::information(this, "失敗", "插入失敗:" + query.lastError().text());}
}add::~add()
{delete ui;
}
add.ui
修改信息界面:
Modify.h
#ifndef MODIFY_H
#define MODIFY_H#include <QWidget>
#include <QMessageBox> //消息對話框
#include <QDebug>
#include <QSqlDatabase> //數據庫驅動
#include <QSqlQuery> //數據庫執行語句
#include <QSqlError> //數據庫報錯namespace Ui {
class Modify;
}class Modify : public QWidget
{Q_OBJECTpublic:explicit Modify(QWidget *parent = nullptr);~Modify();private slots:void on_modify_btn_clicked();private:Ui::Modify *ui;
};#endif // MODIFY_H
Modify.cpp
#include "modify.h"
#include "ui_modify.h"
#include "homepage.h"Modify::Modify(QWidget *parent): QWidget(parent), ui(new Ui::Modify)
{ui->setupUi(this);
}void Modify::on_modify_btn_clicked()
{QString id = ui->id_linedit->text().trimmed();QString name = ui->name_lineEdit->text().trimmed();QString gender = ui->gender_lineEdit->text().trimmed();QString birthdate = ui->birth_lineEdit->text().trimmed();QString major = ui->major_lineEdit->text().trimmed();QString Class = ui->class_lineEdit->text().trimmed();QString college = ui->college_lineEdit->text().trimmed();if(id.isEmpty() || name.isEmpty() || gender.isEmpty()|| birthdate.isEmpty() || major.isEmpty() || Class.isEmpty() || college.isEmpty()){QMessageBox::warning(this, "警告", "信息請填寫完整!");return;}QSqlQuery query;QString sql = QString("update student set name = \"%1\"," "gender =\"%2\", birthdate =\"%3\", major = \"%4\", ""Class = \"%5\", college = \"%6\" where id =%7").arg(name, gender, birthdate, major, Class, college, id);if(query.exec(sql)){QMessageBox::information(this, "成功", "修改成功!");HomePage *homepage = new HomePage();QString nullString = NULL;homepage->refreshTable(nullString); //刷新表格close(); //關閉窗口}else{QMessageBox::information(this, "失敗", "修改失敗!");}
}Modify::~Modify()
{delete ui;
}
Modify.ui
參考資料:
【C++】C++ QT實現 學生信息管理系統(QT源碼)【獨一無二】_qt學生管理系統-CSDN博客
如何用qt實現學生信息管理系統_用qtcreater做一個學生信息管理系統-CSDN博客
Qt 學習第十一天:QTableWidget 的使用_qt tablewidget resize-CSDN博客
Qt 學習第十一天:QTableWidget 的使用_qt tablewidget resize-CSDN博客
Qt設計精美的登錄注冊界面(包含SQLite數據庫應用)_qt登錄界面設計-CSDN博客