基于Qt的员工信息管理系统

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

一、代码部分

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 中的控件。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值