基于QT的图书管理系统

    xiaoxiao2023-11-09  150

     

    使用工具

    编程语言:C++ 编译器:QT Creator 数据库:SQLITE

    QT:  Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。 SQLITE:  sqlite是轻量级的、嵌入式的、关系型数据库,,SQLite可移植性好,很容易使用,很小,高效而且可靠。SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。在QT中集成了sqlite驱动,可以很方便调用数据库,无需像使用mysql那样设置连接密码。

    QT5使用SQLite

    设计思想

    指标 模拟现有图书馆的借阅、续借、归还,图书入库、出库,查询、排序等功能,实现电子图书馆的智慧综合管理,要求:  (1) 掌握抽象数据类型的定义;  (2) 实现数据结构查找算法;  (3) 实现数据结构排序算法;  (4) 使用简单数据库操作;  (5) 友好、易操作的用户交互界面。

    字段名类型介绍备注Book表   idtextISBN书号主键nametext书名 authortext作者 pubtext出版社 pub_datetext出版日期yyyy-MMavailblob是否可借是1,否0storeinteger库存 totalinteger总数 Loan表   user_idtext用户外键book_idtext书籍外键Loan_datetext借阅日期yyyy-MM-ddBack_datetext应还日期yyyy-MM-ddManager表   idtext管理员主键pwdtext密码 User表   idtext用户主键pwdtext密码 emailtext邮箱 loaninteger借阅数 maxinteger可借阅数 

    项目制作过程

    创建数据库

    db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("library.db");

    在mylibrary.pro中加入QT += sql  在主窗口函数中执行上述代码即可创建一个名为library.db的数据库,windows下自动保存在C:\user\username\。

    操作数据库

    使用SQLite管理工具SQLite Browser打开library.db,添加表和字段以及数据。

    代码和功能实现

    创建文件 mylibrary  - mylibrary.pro项目文件  - 头文件  insert.h //录入  mainwindow.h //主窗口  register.h //注册  - 源文件  main.cpp  insert.cpp  mainwindow.cpp  register.cpp  - 界面文件  insert.ui  mainwindow.ui

    界面布局 分别双击界面文件,打开QT设计模式,使拖拉组件,对界面布局    为了实现图形界面自适应大小和部件的动态添加和分布,这里使用了布局功能。

    以下是界面部件的名称和类型: 

    编写槽函数 设计完界面后,需要编写按钮的回调函数,在QT中即槽函数,比较方便的方法是在ui界面中右击部件->转到槽即可生成相应的槽函数声明,然后在其中编写相应的功能即可

    SQL语句实现数据库操作

    QSqlQuery query; query.exec("insert into user values('"+ui->lineEdit->text()+"','"+ui->lineEdit_2 ->text()+"','"+ui->lineEdit_4->text()+"',0,8)");

    如上代码,使用QSqlQuery的exec可以在其中编写SQL语句来直接对数据库进行操作,在注册、登录、录入图书中我们使用了这种方式。

    程序的打包发布

    添加程序图标 在pro文件中加入RC_ICONS = myico.ico,然后将myico.ico放在工程文件夹中编译即可

    打包 程序调试后,可以对程序进行编译,编译后会生成一个编译文件夹,新创建一个程序文件夹,将编译文件夹中的exe文件复制到程序文件夹,在cmd中定位到该文件夹,执行命令

    windeployqt mylibrary.exe

    即可自动生成程序依赖库,之后点击exe即可运行。

    制作过程中的问题和技巧

    中文编码问题  在QT中编写代码时使用中文无法通过编译,包括输入的中文注释和中文提示,但界面中的中文并不会出现这种问题  解决  将所有使用中文字符的文件编码改为不带BOM的UTF-8格式,然后在使用中文字符的cpp文件的头文件中加入一段声明

    #pragma execution_character_set("utf-8")

    动态显示tabWiget的存取问题 tabWiget的tab的动态显示并不能使用hide和show实现,而是使用addTab和removeTab实现的,而tab的存取是要符合堆栈的,即只能

    ui->tabWidget->removeTab(3); ui->tabWidget->removeTab(2); ui->tabWidget->removeTab(1);

    反过来则不能全部移除  - 使用枚举类取代数字  由于数据库列数使用数字代表的,为了在调用各列时清晰方便,我们使用了枚举类代替了这些数字,即

    enum BkIndex{ BkId=0,//序列0 BkName=1, BkAuthor=2, BkPub=3, BkPubDate=4, BkAvail=5, BkStore=6, BkTotal=7 };

    用户类型我们也使用了这种方法

    enum{ MANAGER, USER, VISITOR };

    附录

    使用的函数

    类函数说明QSqlTableModelsetTable设置数据表setEditStrategyModel策略 setSort排序 setHeaderData设置字段名称 select建立表 setModel设置model setFilter查询 revertAll恢复修改 submitAll提交修改 removeRow删除行 record提取数据 insertRecord插入数据 setData修改数据 rowCount行数 QSqlDatabaseQSqlDatabase创建数据库QSqlQueryexec运行SQL语句isActive判断是否执行SQL next提取查询的第一条数据 QDatecurrentDate当前时间addMonths添加月数 vaddDays添加天数 fromString字符转换时间 QSqlRecordsetValue修改数据

    部分代码

    #ifndef MAINWINDOW_H #define MAINWINDOW_H #pragma execution_character_set("utf-8") #include "register.h" #include "insert.h" #include <QMainWindow> #include <QDebug> #include <QtSql> #include <QSqlDatabase> #include <QSqlTableModel> #include <QMessageBox> #include <QString> #include <QSqlError> #include <QDateTime> #include <QDate> #include <QTimer> #include <QSqlRecord> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); //析构 private: QSqlTableModel *BkModel; //图书model QSqlTableModel *UsrModel; //用户model QSqlTableModel *LoanModel; //借阅model QSqlTableModel *UsrLoanModel; //用户借阅信息model Ui::MainWindow *ui; QSqlDatabase db; //数据库 QTimer *timer; int user_type; //用户类型 int book_store; //书籍库存 QString id; enum BkIndex //枚举书籍序号 { BkId=0, BkName=1, BkAuthor=2, BkPub=3, BkPubDate=4, BkAvail=5, BkStore=6, BkTotal=7 }; enum UsrIndex //枚举用户序号 { UsrId=0, UsrPwd=1, UsrEmail=2, UsrLoan=3, UsrMax=4 }; enum LoanIndex //枚举借阅序号 { LUsrId=0, LBkId=1, LDate=2, LBackDate=3 }; enum{MANAGER,USER,VISITOR}; //枚举用户类型 public: bool dbConnect(); //数据库连接 bool dbCreat(); //数据库创建 void UsrLogin(); //用户登录 void UiUpdate(); //更新界面 void MngLogin(); //管理员登录 private slots: void on_pushButton_9_clicked(); //登录 void on_pushButton_10_clicked(); //注册 void on_pushButton_4_clicked(); //录入书籍 void on_pushButton_11_clicked(); //注销 void on_pushButton_5_clicked(); //提交 void on_pushButton_3_clicked(); //删除 void on_pushButton_6_clicked(); //撤销 void on_pushButton_7_clicked(); //删除用户 void on_pushButton_12_clicked(); //提交用户修改 void on_pushButton_13_clicked(); //撤销用户修改 void on_pushButton_2_clicked(); //借阅 void on_pushButton_15_clicked(); //还书 void on_pushButton_14_clicked(); //续借 void on_pushButton_clicked(); //书名查询 void on_pushButton_16_clicked(); //作者查询 void on_pushButton_8_clicked(); //用户查询 void on_pushButton_18_clicked(); //返回主表 void on_pushButton_17_clicked(); //返回主表 }; #endif // MAINWINDOW_H

     

    代码链接:

    链接:https://pan.baidu.com/s/1AVSIQZ6V8TrhZC4sp57niQ  提取码:ttpb  复制这段内容后打开百度网盘手机App,操作更方便哦

     

     

     

     

     

     

     

     

     

     

     

    最新回复(0)