当前位置: 首页 > news >正文

QT肝8天16--加载动态菜单

1、动态菜单的实现方法

动态菜单通常指根据用户权限、角色或系统状态实时变化的菜单结构。Qt 提供了多种菜单控件,用于创建用户界面中的菜单栏、上下文菜单和弹出菜单,如QMenuBar。本项目控制菜单变化的模式是:用户--》角色--》菜单,控制方式简单粗爆管用,粒度大又管用,表结构如下:

 

2、不拖延,上干货

1、定义方法

这里定义的是结构体,如果使用类对象定义也是一样的

#ifndef SQLITE3DB_H
#define SQLITE3DB_H
#include <QDateTime>
#include <QObject>// 定义一个结构--表示用户
typedef struct {quint32 id;        // 用户IdQByteArray icon;   // 用户图标QString username;  // 用户名QString password;  // 密码QString name;      // 名称int gender;        // 性别QString addr;      // 地址QString phoneNo;   // 手机号
} OperatorInfo;// 表示用户的集合
typedef QList<OperatorInfo> OperatorInfoList;
extern OperatorInfo* globalUserInfo;//定义全局变量,表示登录成功的用户//数据库中的菜单结构
typedef struct {  // 描述一个菜单的信息int id;QString name;QString value;QString icon;int parentid;
} MenuItemInfo;
// 菜单带有层级
typedef struct {int id;QString name;QString value;QString icon;QList<MenuItemInfo> list;
} MenuItemRoot;class Sqlite3Db
{
public:Sqlite3Db();public:bool isContain(QString userName, QString passWord, OperatorInfo &infos); //根据用户和密码判断是否存在//分页查询bool selectOperators(QString searchString,int pageIndex,int pageSize,int &pageCount, OperatorInfoList &operatorinfs);//查询列表bool selectOperatorsById(qint64 id, OperatorInfo &operatorinf); //根据id查询bool insertOperator(const OperatorInfo &opt);//添加数据bool deleteOperator(qint64 id);//删除数据bool updateOperator(OperatorInfo info); // 更新数据//数据库查询菜单QList<MenuItemRoot> selectMenuRootItem(qint64 userid);//返回菜单数据QList<MenuItemInfo> findMenuInfoByPID(qint64 pid);//返回子菜单数据};#endif // SQLITE3DB_H

2、数据库实现方法

#include "sqlite3db.h"
#include <QDebug>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QList>Sqlite3Db::Sqlite3Db() {}OperatorInfo* globalUserInfo = nullptr;  // 初始化全局指针为nullptr// Qt访问Sqlite的步骤:
// 1. 引入一个模块 QT       += core gui sql
// 2. 引入头文件
// 3. 使用QSqlDatabase 来进行操作// 根据用户名和密码来判断,用户是否存在数据库中
bool Sqlite3Db::isContain(QString userName, QString passWord, OperatorInfo &infos) {QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db");  // 设置数据库名称db.open();//打开连接// bool isOpen = db.open();//打开连接//输出错误信息// qDebug() << isOpen ;// qDebug() << db.isValid();  // true// qDebug() << db.isOpen();   // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString sqlCmd = QString("SELECT * from operatorInfo where username=? and password=?");// 3.准备参数化占位符的数据query.prepare(sqlCmd);query.bindValue(0, userName);query.bindValue(1, passWord);//4.开始执行语句bool success = query.exec();if (success == false) {db.close();  // 网络资源,需要回收return false;}if (query.next() == false) {db.close();  // 网络资源,需要回收return false;}// 如果继续往后执行,就是已经买查询到对象了,返回这个对象的每个属性值OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();infos = i;db.close();return true;
}// //查询列表
// bool Sqlite3Db::selectOperators(OperatorInfoList &operatorinfs)
// {
//     QSqlDatabase db;
//     db.setHostName("localhost");//设置主机名
//     db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
//     db.setDatabaseName("warehouse.db");  // 设置数据库名称
//     bool isOpen = db.open();//打开连接
//     //输出错误信息
//     qDebug() << isOpen ;
//     qDebug() << db.isValid();  // true
//     qDebug() << db.isOpen();   // true//     // 1.准备查询QSqlQuery 对象
//     QSqlQuery query(db);
//     // 2. 准备Sql语句? :占位符---避免sql注入
//     QString sqlCmd = QString("SELECT * from operatorInfo ");
//     // 3.准备 数据
//     //query.prepare(sqlCmd);//     //4.开始执行语句
//     bool success = query.exec(sqlCmd);
//     if (success == false) {
//         db.close();  // 网络资源,需要回收
//         OperatorInfoList list;
//         operatorinfs=list;
//         return false;
//     }//     // 循环属性值
//     while(query.next()){
//         OperatorInfo i;
//         i.id = query.value(0).toInt();
//         i.icon = query.value(1).toByteArray();
//         i.username = query.value(2).toString();
//         i.password = query.value(3).toString();
//         i.addr = query.value(4).toString();
//         i.gender = query.value(5).toInt();
//         i.name = query.value(6).toString();
//         i.phoneNo = query.value(7).toString();
//         operatorinfs.push_back(i);
//     }
//     db.close(); // 网络资源,需要回收
//     return true;
// }//查询列表,支持分页
bool Sqlite3Db::selectOperators(QString searchString,int pageIndex,int pageSize,int &pageCount, OperatorInfoList &operatorinfs)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db");  // 设置数据库名称bool isOpen = db.open();//打开连接//输出错误信息qDebug() << isOpen ;qDebug() << db.isValid();  // trueqDebug() << db.isOpen();   // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString strWhere=QString(" and 1=1");if(searchString.isNull()==false && searchString.isEmpty()==false){strWhere=QString("  and (name like '%%1%' or username like '%%2%')").arg(searchString).arg(searchString);}//查询分页数据QString datasql = QString("SELECT * from operatorInfo where 1=1 %1 limit %2 offset %3 ").arg(strWhere).arg(pageSize).arg((pageIndex - 1) * pageSize);//查询总页数QString pageCoutSql = QString("select count(id) from operatorInfo where 1=1 %1 ").arg(strWhere);//4.开始执行语句bool success = query.exec(datasql);if (success == false) {db.close();  // 网络资源,需要回收OperatorInfoList list;operatorinfs=list;return false;}// 循环属性值while(query.next()){OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();operatorinfs.push_back(i);//将数据添加到列表中}// 开始查询总条数,计算总页数bool success2 = query.exec(pageCoutSql);if (success2) {if (query.next()) {int dataCount = query.value(0).toInt();pageCount = dataCount / pageSize;if (dataCount % pageSize > 0) {pageCount = pageCount + 1;}}}db.close(); // 网络资源,需要回收return true;
}//添加数据
bool Sqlite3Db::insertOperator(const OperatorInfo &opt)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db");  // 设置数据库名称db.open();//打开连接//bool isOpen = db.open();//打开连接qDebug() << db.isOpen();   // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("insert into operatorInfo(icon,username,password,addr,gender,name,phoneNo) values (?,?,?,?,?,?,?);");query.bindValue(0, opt.icon);query.bindValue(1, opt.username);query.bindValue(2, opt.password);query.bindValue(3, opt.addr);query.bindValue(4, opt.gender);query.bindValue(5, opt.name);query.bindValue(6, opt.phoneNo);//3.开始执行语句bool success = query.exec();db.close(); // 网络资源,需要回收return success;
}//删除数据
bool Sqlite3Db::deleteOperator(qint64 id)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db");  // 设置数据库名称db.open();QSqlQuery query(db);query.prepare("delete from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();db.close();return success;
}//根据id查询一条数据
bool Sqlite3Db::selectOperatorsById(qint64 id, OperatorInfo &operatorinfo)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db");  // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("SELECT * from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();if (success & query.next()) {operatorinfo.id = query.value(0).toInt();operatorinfo.icon = query.value(1).toByteArray();operatorinfo.username = query.value(2).toString();operatorinfo.password = query.value(3).toString();operatorinfo.addr = query.value(4).toString();operatorinfo.gender = query.value(5).toInt();operatorinfo.name = query.value(6).toString();operatorinfo.phoneNo = query.value(7).toString();db.close();  // 网络资源,需要回收return true;}return false;
}// 更新数据
bool Sqlite3Db::updateOperator(OperatorInfo info) {QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db");  // 设置数据库名db.open();                           // 打开连接QString sqlCmd = QString("update operatorInfo set icon = ?,username = ?,addr = ?,gender = ?,name = ?,phoneNo = ? where id = ?");QSqlQuery query(db);query.prepare(sqlCmd);query.bindValue(0, info.icon);query.bindValue(1, info.username);query.bindValue(2, info.addr);query.bindValue(3, info.gender);query.bindValue(4, info.name);query.bindValue(5, info.phoneNo);query.bindValue(6, info.id);bool success = query.exec();if (!success) {qDebug() << "Error executing SQL statement:" << query.lastError().text();}db.close();return success;
}//返回数据库菜单
QList<MenuItemRoot> Sqlite3Db::selectMenuRootItem(qint64 userid)
{QList<MenuItemRoot> menulist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db");  // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from menuitems where id in (select menuID from menurole where roleID=(select roleID from userrole where userID=?))");query.bindValue(0, userid);bool success = query.exec();if (success) {while(query.next()){MenuItemRoot root;root.id = query.value(0).toInt();root.name = query.value(1).toString();root.value = query.value(2).toString();root.icon = query.value(3).toString();menulist.push_back(root);}}db.close(); // 网络资源,需要回收return menulist;
}//根据父id获取二级菜单
QList<MenuItemInfo> Sqlite3Db::findMenuInfoByPID(qint64 pid)
{QList<MenuItemInfo> itemlist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db");  // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from menuitems where parentid=?");query.bindValue(0, pid);bool success = query.exec();if (success) {while(query.next()){MenuItemInfo menuitem;menuitem.id = query.value(0).toInt();menuitem.name = query.value(1).toString();menuitem.value = query.value(2).toString();menuitem.icon = query.value(3).toString();menuitem.parentid = query.value(4).toInt();itemlist.push_back(menuitem);}}db.close(); // 网络资源,需要回收return itemlist;
}

3、生成左侧菜单 

4、处理登录信息

5、登录与主界面关联

6、运行测试

管理员登录 

换个用户登录

原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。

http://www.dtcms.com/a/442115.html

相关文章:

  • Spring Boot整合缓存——Redis缓存!超详细!
  • 湘潭做网站品牌磐石网络wordpress 柚子皮
  • 前端实战开发(二):React + Canvas 网络拓扑图开发:6 大核心问题与完整解决方案
  • 【C语言数据结构】第2章:线性表(2)--线性表的顺序存储结构
  • 计算机操作系统--进程:共享内存和管道的差异
  • 深圳移动网站建设公司上海建筑工程有限公司
  • 【Linux】入门指南:基础指令详解Part One
  • 使用 Docker 部署 Nginx 教程
  • 重庆做网站微信的公司上海平面网站
  • 整站优化seo公司哪家好千峰网课
  • C语言指针应用的经典案例
  • C++篇(11)继承
  • 小迪web自用笔记54
  • 网站logo如何做清晰佛山seo优化电话
  • 词袋模型BoW
  • 数据驱动AI实战:从统计学习方法到业务落地的核心方法论
  • 网站开发需求大吗第一次做怎么放进去视频网站
  • display vlan verbose 概念及题目
  • 深度学习写作:model与module; 试验与实验
  • 企业 网站 程序微信小程序开发平台
  • ViT实战二:Cls token
  • AI + 制造:从技术试点到产业刚需的 2025 实践图鉴
  • JVM内存模型剖析
  • 山东网站制作哪家好网站优化方案和实施
  • 工作中使用到的单词(软件开发)_第五版
  • Vue3 Router高级用法—菜单动态渲染
  • 西安seo网站排名优化公司网站快速推广排名技巧
  • LeetCode算法日记 - Day 62: 黄金矿工、不同路径III
  • 济南建设工程信息网站asp.net实用网站开发
  • deepseek 的对话json导出成word和pdf