Qt实现图书管理系统(C++)
文章目录
- 数据库表的实现
- 创建表
- 将powerDesigner里面的表导出成xxx.sql脚本
- 将SQL文件导入数据库创建表
- 图书管理系统思维导图
- 创建工程
- 开发阶段
- 创建Dlg_login登录页面
- login页面样式
- 主页页面布局
- 主函数测试login
- 设置logo
- 打包程序
- 子页面的样子
- 将子页面放到StackedWidget里面
- 按钮直接形成互斥效果
- 用属性选择器来改变样式
- 设置user页面的标头和设置文本不可编辑
- 创建SqlMgr类进行SQL操作
- 初始化数据库
- 登录功能login
- 用户功能
- getUsers功能
- 导入用户(导入文件里面的数据到数据库)
- 删除用户(del)
- 搜索用户
- 图书管理功能
- 获取图书
- 添加图书
- 修改图书
- 删除图书
- 遇到的错误
- 借阅图书
- 搜索图书
- 借阅记录管理功能
- 获取借阅记录
- 模糊查询记录
- 归还图书
- 出现的问题
- 清空借阅记录
- 登录功能
- 页面展示
数据库表的实现
创建表
创建三个表
将powerDesigner里面的表导出成xxx.sql脚本
此时就会生成文件在桌面了
将SQL文件导入数据库创建表
运行sql文件
设置主键自增
图书管理系统思维导图
创建工程
在qt上创建一个工程项目
把这个四个文件发到controller文件夹下,在创建一个dao文件夹
controller文件夹下面是一些界面类和逻辑类,dao文件夹下就是和数据库交互的
进入项目
加上这一句话
include($$PWD/controller/controller.pri)
正在右键项目执行qmake
添加一句这个以后生成的目标文件都在这里(当前文件目录的上一级创建一个bin 文件夹
开发阶段
创建Dlg_login登录页面
login页面样式
QLabel#le_title{font:38px '方正姚体';} QLabel#name,QLabel#pwd{font: 18px '楷体';} QLineEdit{border-radius:4px;min-height:25px;border:1px solid gray;} QPushButton{border-radius:4px;background-color:#409eff;color:white;font-size:18px;} QWidget#bg{background:white;}主页页面布局
主函数测试login
int main(int argc, char *argv[]) { QApplication a(argc, argv); //实现登录 Dlg_login dlg; int ret=dlg.exec(); if(1==ret){ Cell_main w; w.show(); return a.exec(); } if(0==ret){ exit(0); return 0; } return 0; }实现Dlg_login函数
void Dlg_login::on_btn_login_clicked() { setResult(1); this->hide(); } void Dlg_login::on_btn_exit_clicked() { setResult(0); this->hide(); }设置logo
在资源文件中添加一个app.rc文件,在打开这个app.rc文件 添加一句话:
IDI_ICON1 ICON DISCARDABLE “tubiao.ico”
再把这个ico图标放到这个资源文件里
打包程序
如果还 运行不了,可能是有些库没有权限没靠过来,手动考
子页面的样子
将子页面放到StackedWidget里面
#include "cell_main.h" #include "ui_cell_main.h" #include"dlg_login.h" #include"QPushButton" #include"QDebug" Cell_main::Cell_main(QWidget *parent) : QMainWindow(parent) , ui(new Ui::Cell_main), m_bookPage(nullptr), m_recordPage(nullptr), m_userPage(nullptr) { ui->setupUi(this); //初始化栈窗口 initPage(); } void Cell_main::initPage() { m_bookPage=new cell_BookMgr(this); m_userPage=new cell_UserMgr(this); m_recordPage=new cell_Record(this); //把页面放到栈窗口 ui->stackedWidget->addWidget(m_userPage); ui->stackedWidget->addWidget(m_bookPage); ui->stackedWidget->addWidget(m_recordPage); //设置首页是用户管理 ui->stackedWidget->setCurrentIndex(0); qDebug()children();//获得子控件 for(auto it:l){ //为每个页面进行绑定槽函数 if(it->objectName().contains("btn")) { connect(static_cast(it),&QPushButton::clicked,this,&Cell_main::DealMenu); } } //主页初始化一下 // m_userPage->initPage(); } void Cell_main::DealMenu() { auto str=sender()->objectName(); //切换页面 do{ if("btn_user"==str){ //m_userPage->initPage(); ui->stackedWidget->setCurrentIndex(0); break; } if("btn_book"==str){ //m_bookPage->initPage(); ui->stackedWidget->setCurrentIndex(1); break; } if("btn_his"==str){ //m_recordPage->initPage(); ui->stackedWidget->setCurrentIndex(2); break; } }while(false); } Cell_main::~Cell_main() { delete ui; }在添加完之后在进行切换操作,页面之间切换
按钮直接形成互斥效果
用属性选择器来改变样式
设置user页面的标头和设置文本不可编辑
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//一次选中一行 ui->tableView->setModel(&m_model); ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑 m_model.setHorizontalHeaderLabels(QStringList{"用户id","年级","部门","权限","人物类型","密码","用户名"});创建SqlMgr类进行SQL操作
涉及到的函数函数和变量
class SqlMgr { public: SqlMgr(); //设置单例模式 static SqlMgr* instance; static SqlMgr* getInstance(){ if(nullptr==instance){ instance=new SqlMgr(); } return instance; } void test1(); void init();//初始化数据库 //登录 bool login(QString username,QString password,int &userId); //获取所有用户 QVector getUsers(QString StrCondition=""); //添加用户 void addUsers(QVector ); //删除用户 void delUser(QString userId); //获取所有图书 QVector getBooks(QString StrCondition=""); //添加图书 void addBooks(QVector ); //修改图书 void updateBook(QStringList); //删除图书 QString delBook(QString bookId); //归还图书 QString returnBook(QString userId,QString bookId); //图书借阅 QString borrowBook(QString userId,QString bookId); //获取借阅记录 QVector getRecord(QString strCondition=""); //清除借阅记录 void clearRecord(); // private: QSqlDatabase m_db;初始化数据库
void SqlMgr::init() { m_db=QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName(QCoreApplication::applicationDirPath()+"/db/WpcBook.db"); qDebug() QSqlQuery q(m_db); QString sql=QString("select *from user where username='%1' and password='%2'").arg(username).arg(password); bool ret=q.exec(sql);//执行查询语句 执行成功返回true if(ret==false){ qDebug() QSqlQuery q(m_db); //StrCondition里可以写模糊查询的东西 QString sql=QString("select *from user %1").arg(StrCondition); //获取到的数据可能是多行 QVector qDebug() //读取返回来的数据 //获取这个数据是几行 int col =q.record().count(); QStringList temp; while(q.next()){//向下读 temp.clear(); for(int i=0;i //将这一行数据转换为QString放到 temp qDebug()"用户id","年级","部门","权限","人物类型","密码","用户名"}); QList items.clear();//清理 for(int i=0;i //追加每一个元素 items.append(new QStandardItem(tempList[i])); } //追加到一行上面 m_model.appendRow(items); } } QSqlQuery q(m_db); //StrCondition里可以写模糊查询的东西 //一个个拿出来 for(auto tempList:vec){ QString sql=QString("insert into user VALUES(NULL,'%1','%2','%3','%4','%5','%6')") .arg(tempList[0]) .arg(tempList[1]) .arg(tempList[2]) .arg(tempList[3]) .arg(tempList[4]) .arg(tempList[5]); bool ret=q.exec(sql); if(ret==false){ qDebug() //会弹出页面窗口 auto strPath=QFileDialog::getOpenFileName(nullptr,"输入文件路径"); QVector QFile f(strPath);//读这个文件 qDebug() QByteArray bytes= f.readLine();//一次读一行 //转换为QString 里面的数据类型是 : xxx,xxx,xxx,xxx用,分割 QString str(bytes); qDebug() QMessageBox::information(nullptr,"信息","导入失败",QMessageBox::Ok); return; } //把一行数据的最后的元素的最后两个字节去掉\n\r去掉 strList[strList.size()-1]=strList[strList.size()-1].chopped(2); //存 vec.push_back(strList); } //调用数据库 SqlMgr::getInstance()-addUsers(vec); f.close(); //刷新页面 //ui-le_search-clear(); initPage(); } } QSqlQuery q(m_db); QString sql=QString("delete from user where id= %1").arg(userId); bool ret=q.exec(sql); if(!ret){ qDebug() //获取鼠标点击到的哪一行的 //第一列的数据 int r=ui-tableView-currentIndex().row();//获取当前行号 if(r QMessageBox::information(nullptr,"提示","请选中一行...",QMessageBox::Ok); }else{ //获取r行 的0列 auto id=m_model.item(r,0)-text(); SqlMgr::getInstance()-delUser(id); //刷新页面 initPage(); } } QString sql=QString("where username like '%%1%' or department like '%%1%'").arg(arg1); initPage(sql); } QSqlQuery q(m_db); QString sql=QString("select *from book %1").arg(StrCondition); QVector qDebug() QStringList strList; //获取这些数据有几列 int col=q.record().count(); //从q里面获取数据 while(q.next()){ strList.clear(); for(int i=0;i //把这一行数据放进去 strList //添加图书是一次添加一本 QSqlQuery q(m_db); auto data= vec[0]; QString sql=QString("insert into Wbook values(null,'%1','%2','%3','%4','%5',%6,'');") .arg(data[1]) .arg(data[2]) .arg(data[3]) .arg(data[4]) .arg(data[5]) .arg(data[6]); bool ret=q.exec(sql);//执行查询语句 if(ret==false){ qDebug() //调用dao的getbooks auto vec=SqlMgr::getInstance()-getBooks(condition); //拿数据显示到页面 m_model.clear();//在设置一次头 m_model.setHorizontalHeaderLabels(QStringList{"图书id","图书名称","价格","类型1","类型2","类型3","数量","图片"}); for(QStringList tlist:vec){//拿出一行QStringList QList //追加到items items.append(new QStandardItem(tlist[i])); } qDebug() //添加图书是一次添加一本 QSqlQuery q(m_db); QString sql=QString("insert into book values(null,'%1','%2','%3','%4','%5',%6,'');") .arg(data[0]) .arg(data[1]) .arg(data[3]) .arg(data[4]) .arg(data[5]) .arg(data[2]); bool ret=q.exec(sql);//执行查询语句 if(ret==false){ qDebug() //调用子窗口 Dlg_addOrUp dlg; dlg.setFlag(-1);//添加就设置为-1 dlg.exec(); } ui-setupUi(this); } Dlg_addOrUp::~Dlg_addOrUp() { delete ui; } void Dlg_addOrUp::addOrUp() { QStringList strList; //添加 if(m_flag==-1){ //获取页面输入 strList m_flag=flag; } void Dlg_addOrUp::on_btn_ok_clicked() { addOrUp(); //隐藏页面 this-hide(); } void Dlg_addOrUp::on_btn_cancel_clicked() { this-hide(); } QSqlQuery q(m_db); QString sql=QString("update book set" " name='%1',press='%2',type1='%3',type2='%4'," "type3='%5',cnt='%6' where bookid='%7';") .arg(data[1]) .arg(data[2]) .arg(data[4]) .arg(data[5]) .arg(data[6]) .arg(data[3]) .arg(data[0]); bool ret=q.exec(sql);//执行查询语句 if(ret==false){ qDebug() //判断有没有选中一行将要修改的数据 //要知道鼠标点中哪一行 int r=ui-tableView-currentIndex().row(); if(r QMessageBox::information(nullptr,"信息","请选中要更新的一行",QMessageBox::Ok); } else{ qDebug() QString sql=QString("where bookid= %1").arg(id); //先查询信息显示到页面上 QVector QStringList strList; //添加 if(m_flag==-1){ //获取页面输入 strList//修改 strList.clear(); strList QSqlQuery q(m_db); QString sql=QString("delete from book where bookid= %1").arg(bookId); bool ret=q.exec(sql); if(!ret){ qDebug() //获取鼠标点击到哪一行了 int r=ui-tableView-currentIndex().row(); if(r QMessageBox::information(nullptr,"信息","请选中要删除的一行",QMessageBox::Ok); }else{ auto id =m_model.item(r,0)-text(); QString str=SqlMgr::getInstance()-delBook(id); QMessageBox::information(nullptr,"信息",str=="success"?"删除成功":"删除失败",QMessageBox::Ok); initPage(); } } ui-setupUi(this); } Dlg_getSetBook::~Dlg_getSetBook() { delete ui; } void Dlg_getSetBook::showBorrowBook(QString bookName) { //在页面上显示图书 ui-le_bookname-setText(bookName); } void Dlg_getSetBook::setBookId(QString bookid) { m_bookid=bookid; } void Dlg_getSetBook::on_btn_ok_clicked() { //点击确定之后获取页面上的数据进行调用数据库 auto userName=ui-le_username-text(); auto pwd=ui-le_pwd-text(); //判断用户是否存在 bool ret=SqlMgr::getInstance()-login(userName,pwd); if(ret==false){ QMessageBox::information(nullptr,"提示","该用户不存在",QMessageBox::Ok); return; } // 图书借阅 QString borrowBook(QString userId,QString bookId); //获取用户id QString userid = SqlMgr::getInstance()-getUserid(userName,pwd); m_userid=userid; if(m_userid==""&&m_bookid==""){ QMessageBox::information(nullptr,"提示","用户id或图书id为null",QMessageBox::Ok); return; } QString str=SqlMgr::getInstance()-borrowBook(m_userid,m_bookid); QMessageBox::information(nullptr,"提示",str=="借阅成功"?"借阅成功":"借阅失败",QMessageBox::Ok); //隐藏窗口 this-hide(); } #ifndef DLG_GETSETBOOK_H #define DLG_GETSETBOOK_H #include class Dlg_getSetBook; } class Dlg_getSetBook : public QDialog { Q_OBJECT public: explicit Dlg_getSetBook(QWidget *parent = nullptr); ~Dlg_getSetBook(); //显示你借的那一本书 void showBorrowBook(QString bookName); void setBookId(QString bookid); private slots: void on_btn_ok_clicked(); private: Ui::Dlg_getSetBook *ui; QString m_bookid; QString m_userid; }; #endif // DLG_GETSETBOOK_H QSqlQuery q(m_db); QString sql=QString("update book set cnt=cnt-1 where bookid = %1").arg(bookId); bool ret=q.exec(sql);//执行查询语句 if(ret==false){ qDebug() qDebug() QSqlQuery q(m_db); QString sql=QString("select id from user where username = '%1' and password = '%2' ") .arg(userName) .arg(pwd); bool ret=q.exec(sql);//执行查询语句 if(ret==false){ qDebug() // 移动到结果集中的第一条记录 userid = q.value(0).toString(); } return userid; } QString SqlMgr::secondsToDateString(qint64 seconds) { QDateTime dateTime = QDateTime::fromSecsSinceEpoch(seconds); QString dateString = dateTime.toString("yyyy-MM-dd"); return dateString; } //判断点击了哪一行数据 int r=ui-tableView-currentIndex().row(); if(r QMessageBox::information(nullptr,"信息","请选中要借阅的图书",QMessageBox::Ok); }else{ auto bookid =m_model.item(r,0)-text(); //获得cnt cnt QMessageBox::information(nullptr,"信息","该书没有库存了,嗷了个嗷~",QMessageBox::Ok); return; } //否则向下执行 要进行登记是谁借了这本书调用子页面 Dlg_getSetBook dlg; //获得书的名字 auto bookName =m_model.item(r,1)-text(); dlg.setBookId(bookid);//设置图书id dlg.showBorrowBook(bookName); dlg.exec(); initPage(); } QString sql=QString("where name like '%%1%' or type1 = '%1' or type2 = '%1' or type3 = '%1' ").arg(arg1); initPage(sql); } QSqlQuery q(m_db); QString sql=QString("select * from record %1").arg(strCondition); QVector qDebug() QStringList strList; //获取这些数据有几列 int col=q.record().count(); //从q里面获取数据 while(q.next()){ strList.clear(); for(int i=0;i //把这一行数据放进去 strList auto vec=SqlMgr::getInstance()-getRecord(condition); //拿数据显示到页面 m_model.clear();//在设置一次头 m_model.setHorizontalHeaderLabels(QStringList{"图书id","图书名称","价格","类型1","类型2","类型3","数量","图片"}); for(QStringList strList:vec){ QList items.append(new QStandardItem(strList[i])); } m_model.appendRow(items); } } void cell_Record::on_le_search_textChanged(const QString &arg1) { QString sql=QString("where start like '%%1%' or end like '%%1%' or userid = %1 or bookid = %1").arg(arg1); initPage(sql); } //同过开始时间和结束时间与用户名和密码进行查询 QString sql=QString("where start like '%%1%' or end like '%%1%' or user.username = '%1' or book.name= '%1'").arg(arg1); initPage(sql); } //根据userid==bookid删除记录 在根据bookid为本书cnt(库存+1) QSqlQuery q(m_db); // qDebug() qDebug() qDebug() //获取鼠标点中的哪一行 int r=ui-tableView-currentIndex().row(); if(r QMessageBox::information(nullptr,"信息","请选中要归还的图书",QMessageBox::Ok); }else{ //弹出子页面用户登录之后在删除 Dlg_getSetBook dlg; //获得书的名字 QString tempBookid=m_model.item(r,2)-text(); QString bookName=getBookName(tempBookid.toInt()); //获取图书id auto bookid = m_model.item(r,2)-text(); //获取userid auto userid = m_model.item(r,1)-text(); dlg.setBookId(bookid); dlg.setUserId(userid); dlg.setFlag(true); dlg.showBorrowBook(bookName);//设置到页面上 dlg.exec(); initPage(); } } QString cell_Record::getBookName(int bookid) { QString bookName; bookName=SqlMgr::getInstance()-getBookName(bookid); return bookName; } //点击确定之后获取页面上的数据进行调用数据库 auto userName=ui-le_username-text(); auto pwd=ui-le_pwd-text(); //判断用户是否存在 bool ret=SqlMgr::getInstance()-login(userName,pwd); if(ret==false){ QMessageBox::information(nullptr,"提示","该用户不存在",QMessageBox::Ok); return; } //获取当前登录在Dlg_getsetbook窗口的用户id QString CurUserid = SqlMgr::getInstance()-getUserid(userName,pwd); if(m_userid==""&&m_bookid==""){ QMessageBox::information(nullptr,"提示","用户id或图书id为null",QMessageBox::Ok); return; } if(m_flag==false){//借阅 //借阅图书的时候用当前登录的用户的用户id借阅 m_userid=CurUserid; QString str=SqlMgr::getInstance()-borrowBook(m_userid,m_bookid); QMessageBox::information(nullptr,"提示",str=="借阅成功"?"借阅成功":"借阅失败",QMessageBox::Ok); }else{//归还 if(CurUserid==m_userid){ QString str=SqlMgr::getInstance()-returnBook(m_userid,m_bookid); QMessageBox::information(nullptr,"提示",str=="归还成功"?"归还成功":"归还失败",QMessageBox::Ok); } else{ QMessageBox::information(nullptr,"提示","用户: "+userName+" 未借此书",QMessageBox::Ok); } } //隐藏窗口 this-hide(); } //根据userid==bookid删除记录 在根据bookid为本书cnt(库存+1) QSqlQuery q(m_db); // qDebug() qDebug() qDebug() QDateTime dateTime = QDateTime::fromSecsSinceEpoch(seconds); QString dateString = dateTime.toString("yyyy-MM-dd"); return dateString; } QString SqlMgr::getBookName(int bookid) { QSqlQuery q(m_db); QString sql=QString("select name from book where bookid = %1").arg(bookid); bool ret =q.exec(sql); if(!ret){ qDebug() bookName= q.value(0).toString(); return bookName; } return bookName; } ui-setupUi(this); } Dlg_getSetBook::~Dlg_getSetBook() { delete ui; } void Dlg_getSetBook::showBorrowBook(QString bookName) { //在页面上显示图书 ui-le_bookname-setText(bookName); } void Dlg_getSetBook::setBookId(QString bookid) { m_bookid=bookid; } void Dlg_getSetBook::setFlag(bool flag) { m_flag=flag; } void Dlg_getSetBook::setUserId(QString userid) { m_userid=userid; } void Dlg_getSetBook::setRecordId(QString recordid) { m_recordid=recordid; } void Dlg_getSetBook::on_btn_ok_clicked() { //点击确定之后获取页面上的数据进行调用数据库 auto userName=ui-le_username-text(); auto pwd=ui-le_pwd-text(); //判断用户是否存在 bool ret=SqlMgr::getInstance()-login(userName,pwd); if(ret==false){ QMessageBox::information(nullptr,"提示","该用户不存在",QMessageBox::Ok); return; } //获取当前登录在Dlg_getsetbook窗口的用户id QString CurUserid = SqlMgr::getInstance()-getUserid(userName,pwd); if(m_userid==""&&m_bookid==""){ QMessageBox::information(nullptr,"提示","用户id或图书id为null",QMessageBox::Ok); return; } if(m_flag==false){//借阅 //借阅图书的时候用当前登录的用户的用户id借阅 m_userid=CurUserid; QString str=SqlMgr::getInstance()-borrowBook(m_userid,m_bookid); QMessageBox::information(nullptr,"提示",str=="借阅成功"?"借阅成功":"借阅失败",QMessageBox::Ok); }else{//归还 if(CurUserid==m_userid){ //归还的时候还要用到记录id QString str=SqlMgr::getInstance()-returnBook(m_userid,m_bookid,m_recordid); QMessageBox::information(nullptr,"提示",str=="归还成功"?"归还成功":"归还失败",QMessageBox::Ok); } else{ QMessageBox::information(nullptr,"提示","用户: "+userName+" 未借此书",QMessageBox::Ok); } } //隐藏窗口 this-hide(); } //删除所有图书 QSqlQuery q(m_db); QString sql=QString("delete from record;"); bool ret=q.exec(sql);//执行查询语句 if(ret==false){ qDebug() qDebug() SqlMgr::getInstance()-clearRecord(); initPage(); } auto username=ui-username-text(); auto pwd=ui-password-text(); if(username==""||pwd==""){ QMessageBox::information(nullptr,"提示","用户名或密码不能为空",QMessageBox::Ok); return; } bool ret=SqlMgr::getInstance()-login(username,pwd); if(ret){ setResult(1); hide(); }else{ QMessageBox::information(nullptr,"提示","用户名或密码错误",QMessageBox::Ok); } } QSqlQuery q(m_db); QString sql=QString("select *from user where username='%1' and password='%2'").arg(username).arg(password); bool ret=q.exec(sql);//执行查询语句 执行成功返回true if(ret==false){ qDebug()
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!













































