图书管理系统基于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表中的数据是否符合,匹配成功则登录成功。
先看看效果,样式后面再说。
代码如下:
//连接数据库验证账号密码
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.菜单模块
管理员身份验证成功后进入菜单界面,菜单模块主要有图书管理,读者管理,借阅管理和退出系统四个选项。每个按钮都会跳转至不同界面,实现不同功能。这个模块很简单,点击按钮进行跳转。主要代码和页面如下:
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()));
}
这次介绍到这里,下次继续更新。