目录
application.pro
#-------------------------------------------------
#
# Project created by WHS-NARI GROUP 2022/03/22
#
#-------------------------------------------------
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Application
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
StuManager.cpp \
TeacherManager.cpp \
addstudlg.cpp \
createdb.cpp \
HEADERS += mainwindow.h \
StuManager.h \
TeacherManager.h \
addstudlg.h \
createdb.h \
FORMS += mainwindow.ui \
StuManager.ui \
TeacherManager.ui \
addstudlg.ui
addstudlg.h
#ifndef ADDSTUDLG_H
#define ADDSTUDLG_H
#include <QDialog>
#include <QVariantMap>
namespace Ui {
class AddStuDlg;
}
class AddStuDlg : public QDialog
{
Q_OBJECT
public:
explicit AddStuDlg(QWidget *parent = 0);
~AddStuDlg();
void setEditData(QStringList rowData);
private:
void clearData();
void closeEvent(QCloseEvent *event);
private slots:
void on_buttonBox_accepted();
void on_buttonBox_rejected();
signals:
void signalStuInfo(QVariantMap stuInfo);
private:
Ui::AddStuDlg *ui;
};
#endif // ADDSTUDLG_H
createdb.h
#ifndef CREATEDB_H
#define CREATEDB_H
#include <QList>
#include <QStringList>
class CreateDb
{
public:
CreateDb();
void initDB();
QList<QStringList> selectDataFromBase();
};
#endif // CREATEDB_H
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTabWidget>
#include "StuManager.h"
#include "TeacherManager.h"
#include "createdb.h"
#include "addstudlg.h"
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
enum OperateType
{
Add ,
Edit
};
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void onBtnAdd();
void onBtnEdit();
void onBtnDel();
void onBtnRefresh();
void ExecAddSql(QVariantMap stuInfo);
void ExecEditSql(QVariantMap stuInfo);
void ExecDelSql(QString id);
private:
void initUi();
void setTabCornerBtn();
void initAddDlg();
private:
Ui::MainWindow *ui;
QTabWidget *m_pTabWidget;
StuManager *m_pTableWidget;
TeacherManager *m_pTeacherManager;
CreateDb *m_pCreateDb;
AddStuDlg* m_pAddStuDlg;
OperateType m_operateType;
};
#endif // MAINWINDOW_H
StuManager.h
#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H
#include <QWidget>
namespace Ui {
class StuManager;
}
class StuManager : public QWidget
{
Q_OBJECT
public:
explicit StuManager(QWidget *parent = 0);
~StuManager();
void appendRowData(QStringList rowData); //添加一行数据
void clearTableData(); //清除表格数据
QStringList getCurrentRowData();
QString getCurrentID();
private:
Ui::StuManager *ui;
};
#endif // TABLEWIDGET_H
TeacherManager.h
#ifndef TEACHERMANAGERWIDGET_H
#define TEACHERMANAGERWIDGET_H
#include <QWidget>
namespace Ui {
class TeacherManager;
}
class TeacherManager : public QWidget
{
Q_OBJECT
public:
explicit TeacherManager(QWidget *parent = 0);
~TeacherManager();
private:
Ui::TeacherManager *ui;
};
#endif // TEACHERMANAGERWIDGET_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QFile>
#include <QTextCodec>
#include <QCoreApplication>
#include <QFont>
#include <QTextStream>
int main(int argc, char *argv[])
{
QTextCodec *pCodec = QTextCodec::codecForName("GBK");
if(pCodec)
{
QTextCodec::setCodecForLocale(pCodec);
}
QCoreApplication::setApplicationName("StuTest");//设置应用名称
QApplication a(argc, argv);
QFile file("../Styles/white.qss");
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&file);
QString style = in.readAll();
file.close();
qApp->setStyleSheet(style);
}
QFont serifFont("Times", 12, QFont::Thin);
a.setFont(serifFont);
MainWindow w;
w.setWindowTitle(QObject::tr("管理系统"));
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QObject>
#include <QHBoxLayout>
#include <QPushButton>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
initUi();
initAddDlg();
setTabCornerBtn();
m_pCreateDb = new CreateDb;
m_pCreateDb->initDB(); //打开数据库
onBtnRefresh(); //程序启动时,查询数据
showMaximized();
m_operateType = Add;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onBtnAdd()
{
qDebug()<<"onBtnAdd";
m_operateType = Add;
if(m_pAddStuDlg)
{
m_pAddStuDlg->activateWindow();
m_pAddStuDlg->setWindowTitle(tr("添加: 学生信息"));
m_pAddStuDlg->exec();
}
}
void MainWindow::onBtnEdit()
{
qDebug()<<"onBtnEdit";
m_operateType = Edit;
QStringList rowData ;
rowData = m_pTableWidget->getCurrentRowData();
if(rowData.isEmpty())
{
QMessageBox::information(this, tr("提示") , tr("请选中需要编辑的数据!"));
return ;
}
else
{
m_pAddStuDlg->setEditData(rowData);
}
m_pAddStuDlg->activateWindow();
m_pAddStuDlg->setWindowTitle(tr("修改: 学生信息"));
m_pAddStuDlg->exec();
}
void MainWindow::onBtnDel()
{
qDebug()<<"onBtnDel";
QString ID = m_pTableWidget->getCurrentID();
if(ID.isEmpty())
{
QMessageBox::information(this , tr("提示") , tr("请选中一条记录!"));
return ;
}
QMessageBox::StandardButton button = QMessageBox::question(this , tr("提示") ,tr("确定删除这一条记录?"));
if(button == QMessageBox::Yes)
{
//删除操作
ExecDelSql(ID);
}
}
void MainWindow::onBtnRefresh()
{
qDebug()<<"onBtnRefresh";
QList<QStringList> tableData;
tableData = m_pCreateDb->selectDataFromBase(); //读取数据表中的数据到容器tableData
if(!tableData.isEmpty())
{
m_pTableWidget->clearTableData();
QListIterator<QStringList> itr(tableData); //QListIterator迭代器 遍历输出list的内容
while(itr.hasNext())
{
m_pTableWidget->appendRowData(itr.next());
}
}
}
void MainWindow::ExecAddSql(QVariantMap stuInfo)
{
if(m_operateType == Add)
{
QString create_date = stuInfo.value("datetime").toString();
QString id = stuInfo.value("number").toString();
QString name = stuInfo.value("name").toString();
QString sex = stuInfo.value("sex").toString();
QString age = stuInfo.value("age").toString();
QString address = stuInfo.value("address").toString();
QString phone = stuInfo.value("phone").toString();
QString description = stuInfo.value("desc").toString();
QString sql;
sql = QString("insert into StuManager (create_date,id ,name ,sex ,age ,address , phone ,description)"
" VALUES ('%1', '%2' , '%3' , '%4' , '%5' , '%6' , '%7' , '%8')")
.arg(create_date).arg(id).arg(name).arg(sex).arg(age).arg(address).arg(phone).arg(description);
QSqlQuery query;
bool ok = query.exec(sql);
if(ok)
{
QStringList rowData;
rowData << name <<id <<sex <<age << address <<phone << description ;
m_pTableWidget->appendRowData(rowData);
QMessageBox::information(this ,tr("提示") , tr("添加成功!"));
}
else
{
QMessageBox::information(this ,tr("提示") , tr("添加失败!"));
}
}
}
void MainWindow::ExecEditSql(QVariantMap stuInfo)
{
if(m_operateType == Edit)
{
QString create_date = stuInfo.value("datetime").toString();
QString id = stuInfo.value("number").toString();
QString name = stuInfo.value("name").toString();
QString sex = stuInfo.value("sex").toString();
QString age = stuInfo.value("age").toString();
QString address = stuInfo.value("address").toString();
QString phone = stuInfo.value("phone").toString();
QString description = stuInfo.value("desc").toString();
QString sql;
sql = QString("UPDATE StuManager "
"set create_date = '%0' ,id = '%2' ,name = '%3',"
"sex = '%4',age = '%5',address = '%6', phone = '%7',description = '%8'"
" where id = '%9' ")
.arg(create_date).arg(id).arg(name).arg(sex).arg(age).arg(address).arg(phone).arg(description).arg(id);
QSqlQuery query;
bool ok = query.exec(sql);
if(ok)
{
onBtnRefresh(); //重新加载数据
QMessageBox::information(this ,tr("提示") , tr("修改成功!"));
}
else
{
QMessageBox::information(this ,tr("提示") , tr("修改失败!"));
}
}
}
void MainWindow::ExecDelSql(QString id)
{
QString sql;
sql = QString("DELETE FROM StuManager "
" where id = '%9' ").arg(id);
QSqlQuery query;
bool ok = query.exec(sql);
if(ok)
{
onBtnRefresh(); //重新加载数据
QMessageBox::information(this ,tr("提示") , tr("删除成功!"));
}
else
{
QMessageBox::information(this ,tr("提示") , tr("删除失败!"));
}
}
void MainWindow::initUi()
{
m_pTableWidget = new StuManager;
m_pTeacherManager = new TeacherManager;
m_pTabWidget = new QTabWidget(this);
m_pTabWidget->addTab(m_pTableWidget , tr("学生管理")); //增加选项卡
m_pTabWidget->addTab(m_pTeacherManager ,tr("教师管理"));
setStyleSheet("QTabBar::tab{min-width:30ex; min-height:10ex;}");
setCentralWidget(m_pTabWidget);
setContentsMargins(5 , 10, 5 ,5);
}
void MainWindow::setTabCornerBtn() //设置界面按钮
{
QPushButton *btnRefresh = new QPushButton;
btnRefresh->setText(tr("刷新"));
QPushButton *btnAdd = new QPushButton;
btnAdd->setText(tr("添加"));
QPushButton *btnEdit = new QPushButton;
btnEdit->setText(tr("编辑"));
QPushButton *btnDel = new QPushButton;
btnDel->setText(tr("删除"));
QWidget *widget = new QWidget;
widget->setMinimumSize(20 ,55);
widget->setContentsMargins(0,0,0,10);
QHBoxLayout *hLayout = new QHBoxLayout(widget);
hLayout->addWidget(btnRefresh);
hLayout->addWidget(btnAdd);
hLayout->addWidget(btnEdit);
hLayout->addWidget(btnDel);
widget->setLayout(hLayout);
m_pTabWidget->setCornerWidget(widget ,Qt::TopRightCorner);
connect(btnRefresh , SIGNAL(clicked(bool)) , this ,SLOT(onBtnRefresh()));
connect(btnAdd , SIGNAL(clicked(bool)) , this ,SLOT(onBtnAdd()));
connect(btnEdit , SIGNAL(clicked(bool)), this ,SLOT(onBtnEdit()));
connect(btnDel , SIGNAL(clicked(bool)) ,this , SLOT(onBtnDel()));
}
void MainWindow::initAddDlg()
{
m_pAddStuDlg = new AddStuDlg;
connect(m_pAddStuDlg , SIGNAL(signalStuInfo(QVariantMap)) , this ,SLOT(ExecAddSql(QVariantMap)));
connect(m_pAddStuDlg , SIGNAL(signalStuInfo(QVariantMap)) , this ,SLOT(ExecEditSql(QVariantMap)));
}
StuManager.cpp
#include "StuManager.h"
#include "ui_StuManager.h"
#include <QTableWidgetItem>
#include <QHeaderView>
StuManager::StuManager(QWidget *parent) : QWidget(parent), ui(new Ui::StuManager)
{
ui->setupUi(this);
ui->tableWidget->setColumnCount(7);
ui->tableWidget->setRowCount(0);
ui->tableWidget->setHorizontalHeaderLabels(QStringList() <<"姓名" << "学号"<< "性别"
<<"年龄" <<"家庭住址" <<"联系电话" <<"描述");
ui->tableWidget->setAlternatingRowColors(true);
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}
StuManager::~StuManager()
{
delete ui;
}
void StuManager::appendRowData(QStringList rowData) //按行增加数据
{
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
for(int i = 0 ; i < rowData.size() ; i++)
{
QTableWidgetItem *item = new QTableWidgetItem;
item->setText(rowData.at(i));
ui->tableWidget->setItem(row , i , item);
}
}
void StuManager::clearTableData() //调用removeRow(r)函数清除显示表格中的数据
{
//清除表格
int rowCount = ui->tableWidget->rowCount();
for(int r = rowCount-1 ; r >=0 ; r--)
{
ui->tableWidget->removeRow(r);
}
}
QStringList StuManager::getCurrentRowData() //提取表格中的数据到容器rowdata()
{
QStringList rowData;
int row = ui->tableWidget->currentRow();
if(row != -1)
{
rowData << ui->tableWidget->item(row , 0)->text();
rowData << ui->tableWidget->item(row , 1)->text();
rowData << ui->tableWidget->item(row , 2)->text();
rowData << ui->tableWidget->item(row , 3)->text();
rowData << ui->tableWidget->item(row , 4)->text();
rowData << ui->tableWidget->item(row , 5)->text();
rowData << ui->tableWidget->item(row , 6)->text();
}
return rowData;
}
QString StuManager::getCurrentID() // 标识第2列学号 作为键值 key
{
QString ID ;
int row = ui->tableWidget->currentRow();
if(row != -1)
{
ID = ui->tableWidget->item(row , 1)->text();
}
return ID;
}
TeacherManager.cpp
#include "TeacherManager.h"
#include "ui_teachermanager.h"
TeacherManager::TeacherManager(QWidget *parent) : QWidget(parent), ui(new Ui::TeacherManager)
{
ui->setupUi(this);
}
TeacherManager::~TeacherManager()
{
delete ui;
}
addstudlg.cpp
#include "addstudlg.h"
#include "ui_addstudlg.h"
#include <QDateTime>
#include <QStringList>
#include <QString>
#include <QDebug>
AddStuDlg::AddStuDlg(QWidget *parent) :QDialog(parent),ui(new Ui::AddStuDlg)
{
ui->setupUi(this);
setFixedSize(sizeHint());
// setAttribute(Qt::WA_DeleteOnClose);
}
AddStuDlg::~AddStuDlg() //点击添加、修改弹出对话框
{
delete ui;
}
void AddStuDlg::setEditData(QStringList rowData) //往对话框里输入内容
{
ui->NameEdit->setText(rowData.at(0));
ui->IDEdit->setText(rowData.at(1));
ui->AgeSpinBox->setValue(rowData.at(3).toInt());
ui->SexComboBox->setCurrentText(rowData.at(2));
ui->AddressEdit->setText(rowData.at(4));
ui->PhoneEdit->setText(rowData.at(5));
ui->DescText->setText(rowData.at(6));
ui->IDEdit->setEnabled(false);
}
void AddStuDlg::clearData() //关闭对话框时 清理输入进去的数据
{
ui->NameEdit->clear();
ui->IDEdit->clear();
ui->AgeSpinBox->cleanText();
ui->AddressEdit->clear();
ui->PhoneEdit->clear();
ui->DescText->clear();
}
void AddStuDlg::closeEvent(QCloseEvent *event)
{
clearData();
}
void AddStuDlg::on_buttonBox_accepted() //对话框的确定键
{
QVariantMap stuInfo;
QString name = ui->NameEdit->text();
QString number = ui->IDEdit->text();
QString age = ui->AgeSpinBox->text();
QString sex = ui->SexComboBox->currentText();
QString address = ui->AddressEdit->text();
QString phone = ui->PhoneEdit->text();
QString desc = ui->DescText->toPlainText();
QString datetime = QDateTime::currentDateTime().toString();
stuInfo.insert("datetime" ,datetime );
stuInfo.insert("name" ,name );
stuInfo.insert("number" ,number );
stuInfo.insert("age" ,age );
stuInfo.insert("sex" ,sex );
stuInfo.insert("address" ,address );
stuInfo.insert("phone" ,phone );
stuInfo.insert("desc" ,desc );
emit signalStuInfo(stuInfo);
ui->IDEdit->setEnabled(true);
}
void AddStuDlg::on_buttonBox_rejected() //对话框的取消键
{
ui->IDEdit->setEnabled(true);
close();
}
createdb.cpp
#include "createdb.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
CreateDb::CreateDb() //建立与数据库的连接
{
}
void CreateDb::initDB()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("HostName.db");
db.setDatabaseName("DatabaseName");
bool ok = db.open();
if(ok)
{
qDebug()<<"Create DB";
QSqlQuery query;
query.exec("create table StuManager (create_date datetime, "
"id varchar(20) primary key, name varchar(20) ,"
" sex varchar(20) ,age INTEGER ,"
"address varchar(20) , phone varchar(12) , description varchar(50))");
}
else
{
qDebug()<<db.databaseName();
}
}
QList<QStringList> CreateDb::selectDataFromBase() //查询数据到容器stuInfo
{
QSqlQuery query("SELECT * FROM StuManager");
QList<QStringList> stuInfo;
while (query.next())
{
QStringList rowData ;
rowData <<query.value(2).toString();
rowData <<query.value(1).toString();
rowData <<query.value(3).toString();
rowData <<query.value(4).toString();
rowData <<query.value(5).toString();
rowData <<query.value(6).toString();
rowData <<query.value(7).toString();
rowData <<query.value(8).toString();
stuInfo.append(rowData);
}
return stuInfo;
}