QT+MYSQL实现图书管理系统

图书管理系统基于QT开发框架、C++程序设计语言、MYSQL等开发环境进行设计,本人使用VS集成环境进行操作。下面会详细介绍系统主要模块的开发过程。目前,已经完成了系统的原型设计和系统的试运行,可以使用。达到了设计的目标。
1.介绍
首先介绍几个常用控件,后面经常用到。

QLabel* userNameLbl;  //标签
QLineEdit* userName;  //编辑行
QLineEdit* pwd;    //密码编辑行
QPushButton* loginBtn; //按钮
QTableView* tableView; //视图
QButtonGroup* group; //单选组 可存放多个单选按钮
QRadioButton* user;  //单选按钮
QSqlTableModel* model; //表的模型,用于实现数据可视化

//控件需要布局显示,我使用的3种布局管理器:
QHBoxLayout* p = new QHBoxLayout(this); 水平布局
QVBoxLayout* p = new QVBoxLayout(this); 垂直布局
QGridLayout* pG = new QGridLayout(this); 网格布局
move(x,y)//还有绝对坐标move(x,y)

//告诉窗口是哪个布局
this->setLayout(p);
this->show(); //显示函数,必写

//第一种写法
connect(loginBtn, &QPushButton::clicked, this, &Login::login)
//第二种写法
connect(BorrowBtn, SIGNAL(clicked()), this, SLOT(BorrowBooks()));


loginBtn 发出信号的对象指针,此处就是按钮控件
&QPushButton::clicked 按钮信号类型是clicked()
this 接收信号的对象,此处设定为当前窗体
&Login::login 信号槽函数
槽函数机制:通过按钮点击,响应跳转到绑定的函数。声明函数时放在public/private slots下,不能放在普通的public或private下,如下图所示:

class Login : public QDialog //定义窗口类
{
	Q_OBJECT

public:
	Login(QWidget *parent = Q_NULLPTR);
	~Login();
	void Init(); //界面初始化
	bool ConnectSql(QString username, QString password); //连接数据库验证账号密码

private:
	Ui::Login ui;
	QSqlDatabase db;
	QPushButton* pButton_OK, * pButton_cancel;
	  
public slots: //这里是槽函数声明
	void login();//登录的槽函数
	void Register();//注册
	void RegisterInfo(); //确认注册
};

2.注册
用户可以进行注册,由注册人输入姓名,性别,密码和联系方式。系统自动将注册信息插入到读者表中,注册信息请自由添加。输入确认密码后与密码比对,如果不一致,提示注册人重新输入密码。具体代码如下:

void Login::RegisterInfo() //注册
{
    //Qt里字符串用QString定义,可以拼接sql语句
    //获取用户输入使用  编辑行名字->text()
    //trimmed()可以去除编辑行空格
    QString str_sql = "insert into readers(姓名,性别,password,联系电话) values('" +
        name->text().trimmed()+ "','" +   
        sex->text().trimmed() + "','" +
        password->text().trimmed() + "','"+
        tel->text().trimmed()+"')";

	//如果输入为空,提示信息不全
	if (name->text().trimmed() == "" || sex->text().trimmed() == "" ||tel->text().trimmed() == ""||password->text().trimmed()==""|| passwordAgain->text().trimmed()=="")    
    {
        QMessageBox::information(this, "查询", "您的注册信息不全,请重试");
        this->rw->close(); //注销窗体
        delete rw;  //释放内存
        return; //中断下面操作
    }
    
	//确认密码和密码比对
    if ( password->text().trimmed()!=passwordAgain->text().trimmed())
    {
        QMessageBox::information(this, "", "密码和确认密码不一致,请重新注册信息");
        this->rw->close();
        delete rw;
        return;
    }
 
 	//执行查询语句
    QSqlQuery myQuery(db);
    if (myQuery.exec(str_sql))
    {
   		 //执行语句成功,提示注册成功
        QMessageBox::information(this, "Register", "注册成功");
        this->rw->close();
        delete rw;
        return;
    }
    else 
    {
        QMessageBox::information(this, "", "服务器忙,请重试");
        this->rw->close();
        delete rw;
	}
}

3.说了这么多,发现数据库没连,马上去连接。

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//声明数据库对象
db.setHostName("localhost");  //本地主机号
db.setDatabaseName("librarymanage");//数据库名
db.setPort(3306);
db.setUserName("root"); //数据库账号
db.setPassword("******");//数据库密码,就是安装mysql时你设置的密码
db.exec("SET NAMES 'GB2312'"); //编码格式GB2312
db.open(); //打开数据库

4.登录
我分别设置了管理员登录和用户登录,管理员可以执行一切操作,普通用户只有查询和借书还书操作。这里讲一下管理员登录吧。登录的实质是检查输入的账户名和密码与mysql表中的数据是否符合,匹配成功则登录成功。
先看看效果,样式后面再说。
QT+MYSQL实现图书管理系统_第1张图片
代码如下:

//连接数据库验证账号密码
bool Login::ConnectSql(QString username,QString password)  
{
   
    if (db.open()) //数据库连接成功
    {
        QSqlQuery myQuery(db);
        QMessageBox::information(this, "", "数据库连接成功!!!");
        QString str_sql = "select * from admin where username='"  //拼接SQL语句
            + username
            + "'and password=+'"
            + password
            + "'";
       
            if (myQuery.exec(str_sql2))
            {
                while (myQuery.next())//遍历数据表格每一行,从第0行到最后一行
                {//获取数据库中的账号密码
					QString user = myQuery.value(1).toString();                    
					QString pwd = myQuery.value(2).toString();
					//value()里需要与返回结果集的数据索引位置匹配
                    if (username == user && password == pwd) //与用户输入的账号密码比对
                    {
                    	//找到说明身份正确
                        return true;
                    }
                 }
            }
            return false;  
    }   
    
	else //数据库连接失败
    {
        QMessageBox::warning(this, tr("警告!"), tr("数据库连接失败!"), QMessageBox::Yes);
        return false;
    }
}

账户密码可以输入三次进行验证,如果超过3次密码不匹配,直接退出系统。账户密码验证成功后需要进入功能界面。具体代码如下:

void Login::login()
{
    static int error_count = 1; //静态变量,用于计算用户输入错误的次数
   
    //获得userNameLEd输入框的文本:userName->text();
    //tr()函数,防止设置中文时乱码
    if (ConnectSql(userName->text().trimmed(), pwd->text().trimmed()))
    {
        QMessageBox::information(this, "Log", "恭喜你 登录成功!")
        Menu* p_menu = new Menu(db); //初始化菜单窗口
        this->close();//关闭登录界面
        delete this;  //释放内存
        p_menu->Init(); //进入菜单页
    }
    else
    {
        if (3 - error_count > 0)
        {
            //如果输入错误,提示用户还有几次机会
            //标题              内容                OK按钮  
            QMessageBox::warning(this, "警告", "用户名或密码错误!您还有" + QString::number(3 - error_count) + "次机会");

            // 清空输入框内容
            userName->clear();
            pwd->clear();

            //光标定位
            userName->setFocus();
            ++error_count;
        }
        else
        {
            QMessageBox::information(this, "", "用户名或密码错误次数超上限,请稍后重试!!!");
            exit(0);//退出系统
        }
	}
}

5.菜单模块
管理员身份验证成功后进入菜单界面,菜单模块主要有图书管理,读者管理,借阅管理和退出系统四个选项。每个按钮都会跳转至不同界面,实现不同功能。这个模块很简单,点击按钮进行跳转。主要代码和页面如下:

QT+MYSQL实现图书管理系统_第2张图片

void Menu::Init()
{
	QWidget* w = new QWidget();
	w->setProperty("class", "Menu");
	w->setWindowTitle("菜单页");
	QFont font;  //字体
	w->resize(1920, 1080); //设置窗口尺寸
	BookMangage = new QPushButton("图书管理"); //按钮初始化
	readerMangage = new QPushButton("读者管理");
	BrReMangage = new QPushButton("借阅管理");
	ExitSystem = new QPushButton("退出系统");

	BookMangage->setFixedSize(200, 80); //控件尺寸
	readerMangage->setFixedSize(200, 80);
	BrReMangage->setFixedSize(200, 80);
	ExitSystem->setFixedSize(200, 80); 

	font.setPointSize(20);  //字体大小为20
	BookMangage->setFont(font); //字体设置绑定控件
	readerMangage->setFont(font);
	BrReMangage->setFont(font);
	ExitSystem->setFont(font);
	

	QGridLayout* layout = new QGridLayout;  //网格布局
	layout->addWidget(BookMangage, 0, 2, 1, 1); 
	//括号里参数(控件名,起始位置坐标0,2,控件所占行列1,1)
	layout->addWidget(readerMangage, 1, 2, 1, 1);
	layout->addWidget(BrReMangage, 2, 2, 1, 1);
	layout->addWidget(ExitSystem,3, 2, 1, 1);
	
	w->setLayout(layout);
	w->show();

	connect(BookMangage, SIGNAL(clicked()), this, SLOT(InitBookMangage()));
	connect(readerMangage, SIGNAL(clicked()), this, SLOT(InitReaderMangage()));
	connect(BrReMangage, SIGNAL(clicked()), this, SLOT(InitBrReMangage()));
	connect(ExitSystem, SIGNAL(clicked()), this, SLOT(Exit()));
}

这次介绍到这里,下次继续更新。

你可能感兴趣的:(QT+MYSQL实现图书管理系统)