注:参照编程小鱼酱教程
特别感谢博主教学
一.登陆界面设计及主界面设计
1.登录按钮实现
登陆界面自定义信号 并发射信号
signals:
//成功登录发送信号
void sendLoginSuccess();
emit sendLoginSuccess();
主界面.h中创建登录界面 并在cpp中进行连接 (main.cpp中将主.show屏蔽)
Login login;
//登录按钮
connect(&login,&Login::sendLoginSuccess,[=](){
login.hide();
this->show();
});
2.主界面中的treeWidget 构建
效果如图
设置treewidget列数
ui->treeWidget->setColumnCount(1);
设置根节点
addTopLevelItem(QTreeWidgetItem *item) //注意参数类型
在父节点之后创建新节点 参数(父节点指针,节点内容)(注:为QStringList)
QTreeWidgetItem(QTreeWidget *parent, const QStringList &strings, int type = Type)
QStringList l;
l<<"学生管理系统";
QTreeWidgetItem * pf = new QTreeWidgetItem(ui->treeWidget,l);
ui->treeWidget->addTopLevelItem(pf);
clear();
l<<"学生管理";
QTreeWidgetItem* p1 = new QTreeWidgetItem(pf,l);
ui->treeWidget->addTopLevelItem(p1);
l.clear();
l<<"管理员管理";
QTreeWidgetItem* p2 = new QTreeWidgetItem(pf,l);
ui->treeWidget->addTopLevelItem(p2);
将创建的子节点添加到父节点中 设置为默认全部打开状态
pf->addChild(p1);
pf->addChild(p2);
ui->treeWidget->expandAll();
二.数据库设计
1.新建学生数据库文件:studentSql.h与studentSql.cpp
新建用户类与学生类,并将在头文件中添加属性
struct stuInfo
{
int id;
QString name;
quint8 age;
quint16 grade;
quint16 uiclass;
quint32 studentid;
QString phone;
QString wechat;
};
struct userInfo
{
QString username;
QString password;
QString aut; //权限
};
其中数据类型对应
quint8 | char | 8位无符号整型 |
quint16 | short int | 16位无符号整型 |
quint 32 | int | 32位无符号整型 |
8位即8个二进制数字,转换为十进制范围为0-255 ;以此类推
将各功能接口写入
2.数据库初始化
(此部分未学习。有待更正)
void studentSql::init()
{
//判断是否有驱动
if (QSqlDatabase::drivers().isEmpty())
QMessageBox::information(0,"about","为空");
//连接数据库 参数1 驱动名称 参数2 数据文件路径
m_db = QSqlDatabase::addDatabase("QSQLITE");
//设置数据库路径
m_db.setDatabaseName("E:/data.db");
//判断是否成功打开
if (!m_db.open())
{
QMessageBox::warning(0, "warning","打开失败");
}
}
而后在各功能接口中执行sql语句
//声明数据库
QSqlQuery sql(m_db);
//exec中输入对应sql语句
sql.exec();
}
3.模拟生成数据
使用QRandomGenerator随机生成年龄,班级,年级
//声明随机生成器
QRandomGenerator g;
//随机种子
g.seed(0);
//生成随机数,左闭右开
g.bounded(7,10);
在生成按钮的点击槽函数中实现,完整代码如下
void MainWindow::on_btn_simultion_clicked()
{
//制作10001条学生数据
QRandomGenerator g,c;
g.seed(0);
c.seed(0);
for(int i=0;i<100;i++)
{
auto grade= g.bounded(7,10);//在7-10 左闭右开中随机生成
auto uiclass=g.bounded(1,8);
stuInfo info;
if(i%3)
{
info.name=QString("张%1").arg(i);
info.age=16;
}
if(i%7)
{
info.name=QString("李%1").arg(i);
info.age=17;
}
if(i%2)
{
info.name=QString("王%1").arg(i);
info.age=18;
}
info.grade =grade;
info.uiclass=uiclass;
info.studentid=i;
info.phone="12345678";
info.wechat="12345678";
m_ptrStuSql->addStu(info);
}
}
三.数据库内容显示到界面
将显示数据库内容封装到刷新函数中,实现每个功能时调用,刷新界面信息
//封装更新函数
void MainWindow::upTable();
1.表格部分
1.首先对表格进行设置 首先清空表格内容,使用代码实现表头可避免被清空
ui->tableWidget->clear();
//设置Tablewidget表头
ui->tableWidget->setColumnCount(9);
QStringList l;
l<<"序号"<<"id"<<"姓名"<<"年龄"<<"年级"<<"班级"<<"学号"<<"电话"<<"微信";
ui->tableWidget->setHorizontalHeaderLabels(l); //设置水平表头
//设置表格不可编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//设置单行选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
2.通过学生数据库指针,调用获取当前页学生信息接口(返回值为学生列表)
通过ui->tableWidget->setItem()将内容显示到表格中
语法 :setItem(int row, int column, QTableWidgetItem item)
参数三为指针类型
for(int i=0;i<lStudent.size();i++)
{
ui->tableWidget->setItem(i,0,new QTableWidgetItem(QString::number(i)));//序号
ui->tableWidget->setItem(i,1,new QTableWidgetItem(QString::number(lStudent[i].id)));//序号
ui->tableWidget->setItem(i,2,new QTableWidgetItem(lStudent[i].name)); //姓名
ui->tableWidget->setItem(i,3,new QTableWidgetItem(QString::number(lStudent[i].age))); //年龄
ui->tableWidget->setItem(i,4,new QTableWidgetItem(QString::number(lStudent[i].grade))); //年级
ui->tableWidget->setItem(i,5,new QTableWidgetItem(QString::number(lStudent[i].uiclass))); //班级
ui->tableWidget->setItem(i,6,new QTableWidgetItem(QString::number(lStudent[i].studentid))); //学号
ui->tableWidget->setItem(i,7,new QTableWidgetItem(lStudent[i].phone));
ui->tableWidget->setItem(i,8,new QTableWidgetItem(lStudent[i].wechat));
}
2.制作标签 显示当前学生个数
通过指针调用获取学生数量接口,通过settext显示标签上
//获取学生数量
auto cnt=m_ptrStuSql->getStudentCont();
ui->lb_cnt->setText(QString("数量:%1").arg(cnt));
效果如图