基于 Qt和SQLite,通过 QTableView 展示数据库员工信息,并结合 QSqlQueryModel、QSqlRecord、QSqlQuery 实现员工记录的增删改查。

一、代码部分
1.mainwindow.h
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QDialog>
#include <QFileDialog>
#include <QItemSelectionModel>
#include <QMainWindow>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QtSql>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public:
QSqlDatabase database; // 数据库连接
QSqlQueryModel *queryModel; // 数据模型
QItemSelectionModel *selection; // 选择模型
void openTableview(); // 打开表格视图
void editEmployeeRecord(int row); // 编辑员工记录
private slots:
void on_pushButton_InitSQLiteDB_clicked(); // 初始化数据库
void on_pushButton_AddRecord_clicked(); // 添加记录
void on_pushButton_DelRecord_clicked(); // 删除记录
void on_pushButton_ModifyRecord_clicked(); // 修改记录
void on_pushButton_QueryRecord_clicked(); // 查询记录
void on_pushButton_ExitMis_clicked(); // 退出系统
void
on_tableView_DisplayData_doubleClicked(const QModelIndex &index); // 双击编辑
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
2.mainwindow.cpp
//mainwindow.cpp
#include "mainwindow.h"
#include "addmodifydialog.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
// 设置窗口固定大小和背景色
setFixedSize(this->width(), this->height());
setStyleSheet("background:cyan");
// 初始化按钮状态
ui->pushButton_AddRecord->setEnabled(false);
ui->pushButton_DelRecord->setEnabled(false);
ui->pushButton_QueryRecord->setEnabled(false);
ui->pushButton_ModifyRecord->setEnabled(false);
// 配置表格视图
ui->tableView_DisplayData->setSelectionBehavior(
QAbstractItemView::SelectRows);
ui->tableView_DisplayData->setSelectionMode(
QAbstractItemView::SingleSelection);
ui->tableView_DisplayData->setAlternatingRowColors(true);
}
MainWindow::~MainWindow() { delete ui; }
void MainWindow::openTableview() {
queryModel = new QSqlQueryModel(this);
selection = new QItemSelectionModel(queryModel);
queryModel->setQuery("SELECT * FROM EmployeeTables ORDER BY empNumber");
if (queryModel->lastError().isValid()) {
QMessageBox::critical(this, "警告",
"系统提示:查询员工数据表失败!请检查!\n" +
queryModel->lastError().text());
return;
}
// 设置表头
queryModel->setHeaderData(0, Qt::Horizontal, "员工编号");
queryModel->setHeaderData(1, Qt::Horizontal, "员工姓名");
queryModel->setHeaderData(2, Qt::Horizontal, "员工性别");
queryModel->setHeaderData(3, Qt::Horizontal, "员工身高");
queryModel->setHeaderData(4, Qt::Horizontal, "员工日期");
queryModel->setHeaderData(5, Qt::Horizontal, "联系电话");
queryModel->setHeaderData(6, Qt::Horizontal, "所在省份");
queryModel->setHeaderData(7, Qt::Horizontal, "所在城市");
queryModel->setHeaderData(8, Qt::Horizontal, "所在部门");
queryModel->setHeaderData(9, Qt::Horizontal, "最高学历");
queryModel->setHeaderData(10, Qt::Horizontal, "基本工资");
queryModel->setHeaderData(11, Qt::Horizontal, "员工照片");
queryModel->setHeaderData(12, Qt::Horizontal, "备注");
// 显示数据并启用按钮
ui->tableView_DisplayData->setModel(queryModel);
ui->tableView_DisplayData->setSelectionModel(selection);
ui->pushButton_AddRecord->setEnabled(true);
ui->pushButton_DelRecord->setEnabled(true);
ui->pushButton_QueryRecord->setEnabled(true);
ui->pushButton_ModifyRecord->setEnabled(true);
}
void MainWindow::editEmployeeRecord(int row) {
QSqlRecord currentRecord = queryModel->record(row);
int iempNumber = currentRecord.value("empNumber").toInt();
QSqlQuery query;
query.prepare("SELECT * FROM EmployeeTables WHERE empNumber=:inumber");
query.bindValue(":inumber", iempNumber);
query.exec();
query.first();
if (!query.isValid()) {
return;
}
currentRecord = query.record();
// 创建编辑对话框
AddModifyDialog *addModifyDlg = new AddModifyDialog(this);
Qt::WindowFlags flags = addModifyDlg->windowFlags();
addModifyDlg->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);
addModifyDlg->loadRecordToDlg(currentRecord);
int iResult = addModifyDlg->exec();
if (iResult == QDialog::Accepted) {
QSqlRecord newRecord = addModifyDlg->collectDataFromDlg();
query.prepare("UPDATE EmployeeTables SET "
"empName = :empName, "
"empSex = :empSex, "
"empHeight = :empHeight, "
"empBirthday = :empBirthday, "
"empTelephone = :empTelephone, "
"empProvince = :empProvince, "
"empCity = :empCity, "
"empDepartment = :empDepartment, "
"empEducation = :empEducation, "
"empSalary = :empSalary, "
"empRemarks = :empRemarks, "
"empPhoto = :empPhoto "
"WHERE empNumber = :ID");
// 绑定参数
query.bindValue(":ID", newRecord.value("empNumber"));
query.bindValue(":empName", newRecord.value("empName"));
query.bindValue(":empSex", newRecord.value("empSex"));
query.bindValue(":empHeight", newRecord.value("empHeight"));
query.bindValue(":empBirthday", newRecord.value("empBirthday"));
query.bindValue(":empTelephone", newRecord.value("empTelephone"));
query.bindValue(":empProvince", newRecord.value("empProvince"));
query.bindValue(":empCity", newRecord.value("empCity"));
query.bindValue(":empDepartment", newRecord.value("empDepartment"));
query.bindValue(":empEducation", newRecord.value("empEducation"));
query.bindValue(":empSalary", newRecord.value("empSalary"));
query.bindValue(":empRemarks", newRecord.value("empRemarks"));
query.bindValue(":empPhoto", newRecord.value("empPhoto"));
if (!query.exec()) {
QMessageBox::critical(this, "错误",
"系统提示:员工信息编辑失败!请检查!\n" +
query.lastError().text());
} else {
queryModel->setQuery("SELECT * FROM EmployeeTables ORDER BY empNumber");
}
}
delete addModifyDlg;
}
void MainWindow::on_pushButton_InitSQLiteDB_clicked() {
QString fileName = QFileDialog::getOpenFileName(
this, "请选择要打开的SQL数据库文件", "", "SQLite3数据库文件(*.db *.db3)");
if (fileName.isEmpty()) {
QMessageBox::critical(this, "警告",
"系统提示:未选择SQLite数据库文件,请重新选择",
QMessageBox::Ok, QMessageBox::NoButton);
return;
}
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName(fileName);
if (!database.open()) {
QMessageBox::critical(this, "警告",
"系统提示:SQLite数据库文件打开失败。请重试",
QMessageBox::Ok, QMessageBox::NoButton);
return;
}
openTableview();
}
void MainWindow::on_pushButton_AddRecord_clicked() {
// 获取表结构并设置新员工编号
QSqlQuery query;
query.exec("SELECT * FROM EmployeeTables WHERE empNumber=-1");
QSqlRecord currentRecord = query.record();
currentRecord.setValue("empNumber", queryModel->rowCount() + 1000);
// 创建添加对话框
AddModifyDialog *addmodifydlg = new AddModifyDialog(this);
Qt::WindowFlags flags = addmodifydlg->windowFlags();
addmodifydlg->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);
addmodifydlg->initAddEmployeeDlg(currentRecord);
int iResult = addmodifydlg->exec();
if (iResult == QDialog::Accepted) {
QSqlRecord newRecord = addmodifydlg->collectDataFromDlg();
query.prepare(
"INSERT INTO "
"EmployeeTables(empNumber,empName,empSex,empHeight,empBirthday,"
"empTelephone,empProvince,empCity,empDepartment,empEducation,empSalary,"
"empRemarks,empPhoto)"
"VALUES(:empNumber,:empName,:empSex,:empHeight,:empBirthday,:"
"empTelephone,:empProvince,"
":empCity,:empDepartment,:empEducation,:empSalary,:empRemarks,:"
"empPhoto)");
// 绑定参数
query.bindValue(":empNumber", newRecord.value("empNumber"));
query.bindValue(":empName", newRecord.value("empName"));
query.bindValue(":empSex", newRecord.value("empSex"));
query.bindValue(":empHeight", newRecord.value("empHeight"));
query.bindValue(":empBirthday", newRecord.value("empBirthday"));
query.bindValue(":empTelephone", newRecord.value("empTelephone"));
query.bindValue(":empProvince", newRecord.value("empProvince"));
query.bindValue(":empCity", newRecord.value("empCity"));
query.bindValue(":empDepartment", newRecord.value("empDepartment"));
query.bindValue(":empEducation", newRecord.value("empEducation"));
query.bindValue(":empSalary", newRecord.value("empSalary"));
query.bindValue(":empRemarks", newRecord.value("empRemarks"));
query.bindValue(":empPhoto", newRecord.value("empPhoto"));
if (!query.exec()) {
QMessageBox::critical(this, "警告",
"系统提示:添加员工信息失败!请检查!\n" +
query.lastError().text());
} else {
queryModel->setQuery("SELECT * FROM EmployeeTables ORDER BY empNumber");
}
}
delete addmodifydlg;
}
void MainWindow::on_pushButton_DelRecord_clicked() {
// 获取选中行并删除记录
int currentSelectingRow = selection->currentIndex().row();
QSqlRecord currentRecord = queryModel->record(currentSelectingRow);
if (currentRecord.isEmpty())
return;
int iempNumber = currentRecord.value("empNumber").toInt();
QSqlQuery query;
query.prepare("DELETE FROM EmployeeTables WHERE empNumber=:inumber");
query.bindValue(":inumber", iempNumber);
if (!query.exec()) {
QMessageBox::critical(this, "错误",
"系统提示:删除员工信息失败!请检查!\n" +
query.lastError().text());
} else {
queryModel->setQuery("SELECT * FROM EmployeeTables ORDER BY empNumber");
}
}
void MainWindow::on_pushButton_ModifyRecord_clicked() {
int currentSelectingRow = selection->currentIndex().row();
if (currentSelectingRow < 0) {
QMessageBox::warning(this, "警告",
"系统提示:未选中要修改的员工信息!请检查!");
}
editEmployeeRecord(currentSelectingRow);
}
void MainWindow::on_pushButton_QueryRecord_clicked() {}
void MainWindow::on_pushButton_ExitMis_clicked() { this->close(); }
void MainWindow::on_tableView_DisplayData_doubleClicked(
const QModelIndex &index) {
int currentSelectingRow = index.row();
editEmployeeRecord(currentSelectingRow);
}
3.addmodifydialog.h
//addmodifydialog.h
#ifndef ADDMODIFYDIALOG_H
#define ADDMODIFYDIALOG_H
#include <QDialog>
#include <QSqlRecord>
namespace Ui {
class AddModifyDialog;
}
class AddModifyDialog : public QDialog {
Q_OBJECT
public:
explicit AddModifyDialog(QWidget *parent = nullptr);
~AddModifyDialog();
public:
QSqlRecord mRecord;
void initAddEmployeeDlg(QSqlRecord &recordData); // 初始化添加对话框
QSqlRecord collectDataFromDlg(); // 收集对话框数据
void loadRecordToDlg(QSqlRecord &recordData); // 加载记录到对话框
private slots:
void on_pushButton_AddPhoto_clicked(); // 添加照片
void on_pushButton_DelPhoto_clicked(); // 删除照片
private:
Ui::AddModifyDialog *ui;
};
#endif // ADDMODIFYDIALOG_H
4.addmodifydialog.cpp
//addmodifydialog.cpp
#include "addmodifydialog.h"
#include "ui_addmodifydialog.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
AddModifyDialog::AddModifyDialog(QWidget *parent)
: QDialog(parent), ui(new Ui::AddModifyDialog) {
ui->setupUi(this);
// 设置按钮样式
QPushButton *okButton = ui->buttonBox->button(QDialogButtonBox::Ok);
okButton->setText("确认");
QIcon okIco(":/new/prefix1/images/ok.ico");
okButton->setIcon(okIco);
okButton->setFixedSize(QSize(101, 31));
QPushButton *cancelButton = ui->buttonBox->button(QDialogButtonBox::Cancel);
cancelButton->setText("取消");
QIcon cancelIco(":/new/prefix1/images/cancel.ico");
cancelButton->setIcon(cancelIco);
cancelButton->setFixedSize(QSize(101, 31));
}
AddModifyDialog::~AddModifyDialog() { delete ui; }
void AddModifyDialog::initAddEmployeeDlg(QSqlRecord &recordData) {
mRecord = recordData;
setWindowTitle("员工信息管理系统--添加员工信息 V1.0");
ui->spinEmpNo->setEnabled(true);
ui->spinEmpNo->setValue(recordData.value("empNumber").toInt());
}
QSqlRecord AddModifyDialog::collectDataFromDlg() {
mRecord.setValue("empNumber", ui->spinEmpNo->value());
mRecord.setValue("empName", ui->editName->text());
mRecord.setValue("empSex", ui->comboSex->currentText());
mRecord.setValue("empHeight", ui->SpinHeight->value());
mRecord.setValue("empBirthday", ui->editBirth->date());
mRecord.setValue("empTelephone", ui->editMobile->text());
mRecord.setValue("empProvince", ui->comboProvince->currentText());
mRecord.setValue("empCity", ui->editCity->text());
mRecord.setValue("empDepartment", ui->comboDep->currentText());
mRecord.setValue("empEducation", ui->comboEdu->currentText());
mRecord.setValue("empSalary", ui->spinSalary->value());
mRecord.setValue("empRemarks", ui->editMemo->toPlainText());
return mRecord;
}
void AddModifyDialog::loadRecordToDlg(QSqlRecord &recordData) {
mRecord = recordData;
setWindowTitle("员工信息管理系统--修改员工信息 V1.0");
ui->spinEmpNo->setEnabled(false);
// 加载数据到界面
ui->spinEmpNo->setValue(recordData.value("empNumber").toInt());
ui->editName->setText(recordData.value("empName").toString());
ui->comboSex->setCurrentText(recordData.value("empSex").toString());
ui->SpinHeight->setValue(recordData.value("empHeight").toFloat());
ui->editBirth->setDate(recordData.value("empBirthday").toDate());
ui->editMobile->setText(recordData.value("empTelephone").toString());
ui->comboProvince->setCurrentText(recordData.value("empProvince").toString());
ui->editCity->setText(recordData.value("empCity").toString());
ui->comboDep->setCurrentText(recordData.value("empDepartment").toString());
ui->comboEdu->setCurrentText(recordData.value("empEducation").toString());
ui->spinSalary->setValue(recordData.value("empSalary").toInt());
ui->editMemo->setPlainText(recordData.value("empRemarks").toString());
// 处理照片
QVariant qVa = recordData.value("empPhoto");
if (!qVa.isValid()) {
ui->LabPhoto->clear();
} else {
QByteArray byteArray = qVa.toByteArray();
QPixmap pics;
pics.loadFromData(byteArray);
ui->LabPhoto->setPixmap(pics.scaledToWidth(ui->LabPhoto->size().width()));
}
}
void AddModifyDialog::on_pushButton_AddPhoto_clicked() {
QString fileName = QFileDialog::getOpenFileName(
this, "", "请选择要打开的员工照片!", "文件(*.jpg *.jepg *.bmp *.png)");
if (fileName.isEmpty()) {
QMessageBox::critical(this, "错误", "系统提示:打开员工照片失败!请检查!");
return;
}
QFile *qFile = new QFile(fileName);
qFile->open(QFile::ReadOnly);
QByteArray byteArray = qFile->readAll();
qFile->close();
mRecord.setValue("empPhoto", byteArray);
QPixmap pics;
pics.loadFromData(byteArray);
ui->LabPhoto->setPixmap(pics.scaledToWidth(ui->LabPhoto->size().width()));
}
void AddModifyDialog::on_pushButton_DelPhoto_clicked() {
// 删除照片功能待实现
}
二、主要函数说明
1.on_pushButton_InitSQLiteDB_clicked()——初始化数据库
系统入口,建立数据库的连接。点击“初始化数据库”按钮后,弹出文件选择框,选择SQLite数据库文件。通过QSqlDatabase::addDatabase("QSQLITE")建立连接,并设置数据库文件路径。若打开失败,用QMessageBox::critical()给出提示。成功后调用openTableview(),把数据加载到UI。
2.openTableview()——打开员工信息表
把数据库数据显示到到QTableView。新建QSqlQueryModel对象,执行setQuery("SELECT*FROMEmployeeTablesORDERBYempNumber")。再用setHeaderData()加上表头(员工编号”、“员工姓名”等等)。接着把模型绑定到tableView_DisplayData,并用QItemSelectionModel跟踪用户选择,最后更新按钮状态。
3.editEmployeeRecord(int row)——编辑员工信息
双击表格某一行或点击“修改记录”按钮时触发。用queryModel->record(row)拿到当前行的QSqlRecord。为了确保数据是最新的,凭借"empNumber"的值、用QSqlQuery对象再一次获取该行信息。然后打开AddModifyDialog对话框,用loadRecordToDlg()装载数据到UI界面。用户点“确认”后,用collectDataFromDlg()收集修改结果,并进行UPDATE更新。更新成功后调用queryModel->setQuery()刷新视图。

4.on_pushButton_AddRecord_clicked()——添加记录
点击“添加员工”按钮时触发。用empNumber=-1查询数据库,获取一个空的QSqlRecord表结构作为新增记录的模板,接着生成编号(rowCount()+1000)。打开AddModifyDialog对话框,调用initAddEmployeeDlg()初始化UI界面。若用户点击确认,调用collectDataFromDlg()收集数据、执行SQLite的插入语句,插入新行。若插入成功后,刷新视图。
三、SQLite基础知识介绍
SQLite获Qt支持,跨平台、不需要安装。单个.db 文件即可运行,不需要独立服务器。项目中 EmployeeTables表的字段大致如下。
CREATE TABLE EmployeeTables (
empNumber INTEGER PRIMARY KEY, // 编号
empName TEXT NOT NULL, // 姓名
empSex TEXT, // 性别
empHeight REAL, // 身高
empBirthday DATE, // 出生日期
empTelephone TEXT, // 联系电话
empProvince TEXT, // 省份
empCity TEXT, // 城市
empDepartment TEXT, // 部门
empEducation TEXT, // 学历
empSalary INTEGER, // 工资
empRemarks TEXT, // 备注
empPhoto BLOB // 照片
);
字段一一对应AddModifyDialog 中的控件。
4126

被折叠的 条评论
为什么被折叠?



