Qt-数据库开发-用户登录、后台管理用户

Qt-数据库开发-用户登录、后台管理用户

  • [1] Qt-数据库开发-用户登录、后台管理用户
    • 1、概述
    • 2、实现效果
  • [2] Qt使用SqlLite实现权限管理
    • 初始化数据库
    • 创建数据表
    • 插入数据
    • 可使用结构体对数据信息进行封装
    • 数据库查询函数为
    • 数据库更新数据函数为
    • 删除数据函数为
  • [3] 测试效果
  • [4] sqlite3查询库里所有表名
    • 查询与判断表
  • [5] 任务栏显示登录状态和系统时间
    • 运行效果
    • 源代码


Navicat 16 for SQLite v16.1.15 32/64位

https://www.jb51.net/database/711194.html

SQLite 教程

https://www.runoob.com/sqlite/sqlite-where-clause.html

[1] Qt-数据库开发-用户登录、后台管理用户

原文链接:https://blog.csdn.net/qq_43627907/article/details/128265671

1、概述

开发环境说明

系统:Windows10、Ubuntu20.04
Qt版本:V5.12.5
编译器:MSVC2017-64、GCC/G++64

2、实现效果

  • 通过按键新建 空白数据行;
  • 使用自增Key;
  • 通过按键更新数据;
  • 判断表是否存在,不存在则创建。
  • 用户登录功能,默认创建超级管理员账号root
  • 支持用户后台管理,通过后台创建、修改、删除用户
  • 用户分为超级管理员、普通管理员、普通用户三个等级;
  • 超级管理员有所有权限,可创建、修改、删除普通管理员、普通用户;
  • 普通管理员可创建、修改、删除普通用户,可新建、修改、查询数据;
  • 普通用户不可修改用户信息,不可新建、修改数据库信息,只可查询。
    实现效果如下:
    在这里插入图片描述
    3、主要代码
    啥也不说了,直接上代码,一切有注释

pro文件: Qt使用到数据库,上来什么都别管,先在pro文件添加上QT += sql ;

dialog.cpp文件:登录界面

#include "dialog.h"
#include "ui_dialog.h"#include <QSqlQuery>
#include <qmessagebox.h>
#include <QDebug>bool Dialog::m_loggedIn = false;                           // 登录状态
QString Dialog::m_userName;                                // 登录的用户名
UserBackstage::UserType Dialog::m_userType;                // 用户类型Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{ui->setupUi(this);this->setWindowTitle("登录");m_db = QSqlDatabase::addDatabase("QSQLITE");  // 使用数据库驱动(Qsqlite)和默认连接名称(qt_sql_default_connection)添加一个数据库m_db.setDatabaseName("SignIn.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)if(!m_db.open())             // 打开数据库{QMessageBox::critical(nullptr, "Error", "打开数据库失败!");return ;}// 创建一个用于保存用户信息的表if(!isTableExists("User")){QSqlQuery query;// 创建一个表person,包含id、firstname、lastname三个字段bool ret = query.exec("create table User (""id         integer primary key,"    // 索引(自增key)"userName   varchar(20),"            // 用户名"password   varchar(20),"            // 密码"type       int)");                  // 用户类型if(!ret){qDebug() << "创建表失败:";}else{QSqlQuery query;query.prepare("insert into User(userName, password, type)""values (:userName, :password, :type)");query.bindValue(":userName", "root");query.bindValue(":password", "123456");query.bindValue(":type", int(UserBackstage::Root));query.exec();}}
}Dialog::~Dialog()
{if(m_db.isOpen()){m_db.close();       // 关闭数据库}delete ui;
}/*** @brief   返回登录状态* @return  true登录 false未登录*/
bool Dialog::loggedIn()
{return m_loggedIn;
}/*** @brief   返回登录的用户名* @return  如果没有则为空*/
QString Dialog::userName()
{return m_userName;
}/*** @brief   返回登录的用户类型* @return*/
UserBackstage::UserType Dialog::type()
{return m_userType;
}/*** @brief         判断表是否存在* @param table* @return*/
bool Dialog::isTableExists(const QString &table)
{QSqlQuery query;QString sql = QString("select * from sqlite_master where name = '%1';").arg(table);  // 查询sqlite_master表中是否存在表名if(query.exec(sql)){return query.next();}return false;
}/*** @brief 登录*/
void Dialog::on_but_signIn_clicked()
{QString userName = ui->line_user->text().trimmed();QString password = ui->line_password->text().trimmed();if(userName.isEmpty()){QMessageBox::about(this, "注意!", "用户名不能为空");return;}if(password.isEmpty()){QMessageBox::about(this, "注意!", "用户密码不能为空");return;}// 从数据库中查询用户和密码,完成登录功能QSqlQuery query;QString sql = QString("select * from User where userName = '%1';").arg(userName);  // 查询用户if(query.exec(sql)){if(query.next())   // true则用户存在{if(password == query.value("password").toString())   // 密码相等{m_userName = userName;m_userType = UserBackstage::UserType(query.value("type").toInt());m_loggedIn = true;this->close();}else{QMessageBox::about(this, "注意", "输入密码错误!");}}else{QMessageBox::about(this, "注意", "用户不存在!");}}else{QMessageBox::about(this, "注意", "sql指令执行失败!");}
}

widget.cpp文件: 数据显示界面

#include "widget.h"
#include "ui_widget.h"
#include "dialog.h"
#include "userbackstage.h"
#include <QMessageBox>
#include <QSqlDatabase>
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QString user;switch (Dialog::type()){case UserBackstage::User:{ui->but_user->setVisible(false);                                    // 隐藏用户管理功能ui->but_add->setVisible(false);                                     // 隐藏数据新建功能ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);  // 普通用户禁用修改数据功能user = QString("普通用户:%1").arg(Dialog::userName());break;}case UserBackstage::Admin:{user = QString("普通管理员:%1").arg(Dialog::userName());break;}case UserBackstage::Root:{user = QString("超级管理员:%1").arg(Dialog::userName());break;}}this->setWindowTitle(QString("QSql-用户登录Demo - V%1  %2").arg(APP_VERSION).arg(user));
}Widget::~Widget()
{delete ui;
}void Widget::on_but_connect_clicked()
{if(ui->but_connect->text() == "关闭数据库"){ui->but_connect->setText("连接数据库");m_db.close();}else{m_db = QSqlDatabase::addDatabase("QSQLITE");  // 使用数据库驱动(Qsqlite)和默认连接名称(qt_sql_default_connection)添加一个数据库
//        qDebug() << QSqlDatabase::defaultConnection;           // 打印默认数据库连接名称m_db.setDatabaseName("SignIn.db");        // 使用文件数据库(可生成数据库文件,数据一直有效)if(!m_db.open())             // 打开数据库{QMessageBox::critical(nullptr, "Error", "打开数据库失败!");return ;}// 如果表不存在则创建表if(!isTableExists("person")){QSqlQuery query;// 创建一个表person,包含id、firstname、lastname三个字段bool ret = query.exec("create table person (""id         integer primary key,"    // 索引(自增key),使用integer默认为自增, int不能设置主键自增"firstname  varchar(20),"         // 名"lastname   varchar(20))");       // 姓if(!ret){qDebug() << "创建表失败:";}}initModel();ui->but_connect->setText("关闭数据库");}
}/*** @brief        判断表是否存在* @param table  表名称* @return       true存在 false不存在*/
bool Widget::isTableExists(const QString &table)
{QSqlQuery query;QString sql = QString("select * from sqlite_master where name = '%1';").arg(table);  // 查询sqlite_master表中是否存在表名if(query.exec(sql)){return query.next();}return false;
}/*** @brief SQL 表模型(QSqlTableModel)来编辑数据库中的信息*/
void Widget::initModel()
{if(m_model){m_model->clear();delete m_model;m_model = nullptr;}m_model = new QSqlTableModel(this, m_db);m_model->setTable("person");                                // 设置需要显示的数据库表
#if 1m_model->setEditStrategy(QSqlTableModel::OnFieldChange);    // 在界面上修改后数据立刻保存到数据库
#elsem_model->setEditStrategy(QSqlTableModel::OnManualSubmit);   // 将将编辑数据库中值的策略设置为[在调用 submitAll() 或 revertAll() 之前,所有更改都将缓存在模型中(即在界面上修改数据后不会立刻存入数据库)]
#endifm_model->setHeaderData(0, Qt::Horizontal, "ID");m_model->setHeaderData(1, Qt::Horizontal, "名称");m_model->setHeaderData(2, Qt::Horizontal, "姓氏");ui->tableView->setModel(m_model);
}/*** @brief 添加空白数据行*/
void Widget::on_but_add_clicked()
{QSqlQuery query;query.prepare("insert into person(firstname, lastname)"       // 写入数据时不需写入id字段,实现自增"values (:firstname, :lastname)");query.bindValue(":firstname", "");query.bindValue(":lastname", "");query.exec();m_model->select();                                           // 获取数据库中的数据
}/*** @brief 查询数据库更新界面*/
void Widget::on_but_read_clicked()
{if(!m_model) return;m_model->select();                                         // 获取数据库中的数据ui->tableView->resizeColumnsToContents();                  // 根据表格中的内容自动调整列宽
}void Widget::on_but_user_clicked()
{UserBackstage user;user.setUserType(Dialog::type());user.exec();
}

userbackstage.cpp文件: 用户管理后台

#include "userbackstage.h"
#include "ui_userbackstage.h"
#include <QDebug>
#include <qmessagebox.h>
#include <qsqlquery.h>UserBackstage::UserBackstage(QWidget *parent) :QDialog(parent),ui(new Ui::UserBackstage)
{ui->setupUi(this);m_model = new QSqlTableModel(this);m_model->setTable("User");                                // 设置需要显示的数据库表ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);m_model->setHeaderData(0, Qt::Horizontal, "ID");m_model->setHeaderData(1, Qt::Horizontal, "用户名");m_model->setHeaderData(2, Qt::Horizontal, "密码");m_model->setHeaderData(3, Qt::Horizontal, "用户类型");ui->tableView->setModel(m_model);m_model->select();                                         // 获取数据库中的数据ui->tableView->resizeColumnsToContents();                  // 根据表格中的内容自动调整列宽
}UserBackstage::~UserBackstage()
{delete ui;
}/*** @brief       设置登录的用户类型* @param type*/
void UserBackstage::setUserType(UserBackstage::UserType type)
{m_userType = type;// 添加用户类型ui->com_type->clear();switch (type){case User:{break;}case Admin:{ui->com_type->addItem("普通用户", User);m_model->setFilter(QString("type = '%1'").arg(int(User)));     // 只显示普通用户的信息break;}case Root:{ui->com_type->addItem("普通用户", User);ui->com_type->addItem("管理员", Admin);break;}}
}/*** @brief 设置用户信息*/
void UserBackstage::on_but_set_clicked()
{QString userName = ui->line_user->text().trimmed();QString password = ui->line_password->text().trimmed();UserType userType = UserType(ui->com_type->currentIndex());if(userName.isEmpty()){QMessageBox::about(this, "注意!", "用户名不能为空");return;}if(password.isEmpty()){QMessageBox::about(this, "注意!", "用户密码不能为空");return;}QSqlQuery query;QString sql = QString("select * from User where userName = '%1';").arg(userName);  // 查询用户if(query.exec(sql)){if(query.next())   // true则用户存在则更新数据{int type = query.value("type").toInt();if(type >= m_userType)         // 如果修改的用户等级超过登录用户等级,则修改失败{return;}sql = QString("update User set password='%1', type=%2  where userName = '%3';").arg(password).arg(int(userType)).arg(userName);query.exec(sql);}else               // 用户不存在则插入数据{query.prepare("insert into User(userName, password, type)""values (:userName, :password, :type)");query.bindValue(":userName", userName);query.bindValue(":password", password);query.bindValue(":type", int(userType));query.exec();}m_model->select();                                         // 获取数据库中的数据}else{qDebug() << "指令执行失败";}
}/*** @brief 删除用户信息*/
void UserBackstage::on_but_delete_clicked()
{QString userName = ui->line_user->text().trimmed();if(userName.isEmpty()){QMessageBox::about(this, "注意!", "用户名不能为空");return;}QSqlQuery query;QString sql = QString("delete from User where userName = '%1';").arg(userName);  // 查询用户if(query.exec(sql)){m_model->select();                                         // 获取数据库中的数据}else{qDebug() << "指令执行失败";}
}

[2] Qt使用SqlLite实现权限管理

https://blog.csdn.net/weixin_41377572/article/details/127719446?ops_request_misc=&request_id=&biz_id=102&utm_term=qt%20%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-127719446.142v86insert_down1,239v2insert_chatgpt&spm=1018.2226.3001.4187

根据Sqlite轻量级数据库的优势,便于对于数据进行增删改查等操作。
本例模拟权限列表对不同界面进行权限管理,管理员针对不同人员进行权限设定,灵活性更高。
动态演示效果如下:
在这里插入图片描述
考虑数据库数据安全,可进行哈希散列值计算进行加密,Qt提供QCryptographicHash类进行数据加密,本例中使用的加密函数为:

QString SqlHelper::encode(QString str) {QString strPwdSha = "";if (str == "") {return "";}QByteArray bytePwd = str.toLatin1();QByteArray bytePwdSha = QCryptographicHash::hash(bytePwd, QCryptographicHash::Sha256);strPwdSha = bytePwdSha.toHex().toUpper();return strPwdSha;
}
QString SqlHelper::encodePwd(QString str) {if (str == "") {return "";}QString endata = encode(str);QString strdata = "";for (int i = 0; i < endata.size(); i++) {if (i % 4 == 0) {strdata += endata[i];}}return strdata + "SAP";
}

初始化数据库

void SqlHelper::connectDataBase() {db = QSqlDatabase::addDatabase("QSQLITE", "sqlite1");// 驱动类型,连接名(默认)db.setDatabaseName("DbData/data.db");db.setHostName("localhost.");db.setUserName("root");db.setPassword("123456");m_DbState = db.open();
}

创建数据表

void SqlHelper::IniSql() {QSqlQuery query(db);QString strCmd = QString("create table employee(employee_id varchar(64) primary key,""employee_name varchar(64),employee_pass varchar(32),employee_settingrole varchar(16),""employee_menurole varchar(16),employee_logrole varchar(16),employee_sex varchar(16))");query.prepare(strCmd);if (query.exec()){qDebug() << "----employee 数据库表:创建成功!";insertData("admin", "root", "root123456", 1,1,1,"male");}else {qDebug() << "----employee 数据表已经存在-----";}
}

插入数据

bool SqlHelper::insertData(QString userid, QString username, QString userpass, int sflag, int mflag, int lflag, QString usersex) {if (!m_DbState) {return false;}QList<employeeInfo> list = queryAllInfo();m_mutex.lock();bool flag = false;//qDebug() << "m_id:  " << m_id;QSqlQuery query(db);QString str = QString("insert into employee values(?,?,?,?,?,?,?)");query.prepare(str);//query.bindValue(0, list.size() + 1);query.bindValue(0, userid);query.bindValue(1, username);QString pass = encodePwd(userpass);query.bindValue(2, pass);QString setrole = userid;setrole.append(QString::number(sflag));setrole = encodeRole(setrole,RoleType::SettingRole);query.bindValue(3, setrole);QString mrole = userid;mrole.append(QString::number(mflag));mrole = encodeRole(mrole, RoleType::MenuRole);query.bindValue(4, mrole);QString lrole = userid;lrole.append(QString::number(lflag));lrole = encodeRole(lrole, RoleType::LogRole);query.bindValue(5, lrole);query.bindValue(6, usersex);if (query.exec()) {qDebug() << "插入数据成功----";flag = true;}else {qDebug() << "插入数据失败----";}m_mutex.unlock();//qDebug() << "777777777777777777777777";return flag;
}

可使用结构体对数据信息进行封装

struct employeeInfo {QString employee_id = "";QString employee_name;QString employee_pass;QString employee_settingrole;QString employee_menurole;QString employee_logrole;QString employee_sex;
}; 

数据库查询函数为

QList<employeeInfo> SqlHelper::queryAllInfo() {QList<employeeInfo> list;if (!m_DbState) {return list;}m_mutex.lock();QSqlQuery query(db);QString str = "select * from employee";query.prepare(str);if (query.exec()) {while (query.next()) {//qDebug() << "name---" << query.value(1).toString() << " age-" << query.value(2).toInt();employeeInfo employee;employee.employee_id = query.value(0).toString();employee.employee_name = query.value(1).toString();employee.employee_pass = query.value(2).toString();employee.employee_settingrole = query.value(3).toString();employee.employee_menurole = query.value(4).toString();employee.employee_logrole = query.value(5).toString();employee.employee_sex = query.value(6).toString();list.append(employee);}}m_mutex.unlock();return list;
}
employeeInfo SqlHelper::queryOne(QString userid) {employeeInfo employee;if (!m_DbState) {return employee;}m_mutex.lock();QSqlQuery query(db);QString str = "select * from employee where employee_id =?";query.prepare(str);query.addBindValue(userid);if (query.exec()) {while (query.next()) {employee.employee_id = query.value(0).toString();employee.employee_name = query.value(1).toString();employee.employee_pass = query.value(2).toString();employee.employee_settingrole = query.value(3).toString();employee.employee_menurole = query.value(4).toString();employee.employee_logrole = query.value(5).toString();employee.employee_sex = query.value(6).toString();}}m_mutex.unlock();return employee;
}

数据库更新数据函数为

bool SqlHelper::updateData(QString userid, QString username, QString userpass, int sflag ,int mflag, int lflag, QString usersex) {if (!m_DbState) {return false;}QSqlQuery query(db);QString str = "update employee set employee_name =?,employee_pass=?,""employee_settingrole=?,employee_menurole=?,employee_logrole=? , employee_sex = ? where employee_id =?";query.prepare(str);query.addBindValue(username);QString ss = queryPass(userid);m_mutex.lock();bool flag = false;if (ss == userpass) {query.addBindValue(ss);}else {userpass = encodePwd(userpass);query.addBindValue(userpass);}QString nsr = userid;nsr.append(QString::number(sflag));nsr = encodeRole(nsr, RoleType::SettingRole);query.addBindValue(nsr);QString nmr = userid;nmr.append(QString::number(mflag));nmr = encodeRole(nmr, RoleType::MenuRole);query.addBindValue(nmr);QString nlr = userid;nlr.append(QString::number(lflag));nlr = encodeRole(nlr, RoleType::LogRole);query.addBindValue(nlr);query.addBindValue(usersex);query.addBindValue(userid);if (query.exec()) {flag = true;qDebug() << "更新成功---";}else {flag = false;qDebug() << "更新失败---";}m_mutex.unlock();return flag;
}

删除数据函数为

bool SqlHelper::deleteData(QString userid) {if (!m_DbState) {return false;}employeeInfo one = queryOne(userid);if (one.employee_id == "") {qDebug() << "此人已删除----";return false;}m_mutex.lock();bool flag = false;QSqlQuery query(db);QString str = "delete from employee where employee_id=?";query.prepare(str);query.addBindValue(userid);if (query.exec()) {flag = true;qDebug() << "删除成功---";}else {flag = false;qDebug() << "删除失败---";}m_mutex.unlock();return flag;
}

[3] 测试效果

“loginform.h”

#ifndef LOGINFORM_H
#define LOGINFORM_H#include <QDialog>
#include <QDebug>namespace Ui {
class LoginForm;
}class LoginForm : public QDialog
{Q_OBJECT
public:enum UserType {User,            // 普通用户Admin,           // 普通管理员Root             // 超级管理员(唯一)};
public:explicit LoginForm(QWidget *parent = nullptr);~LoginForm();static bool loggedIn();static QString userName();static UserType type();private slots:void on_pBtn_Confirm_clicked();void on_pBtn_Cancel_clicked();private:Ui::LoginForm *ui;static UserType m_userType;     //当前用户类型static bool    m_loggedIn;      // 登录状态static QString m_userName;      // 登录的用户名
};#endif // LOGINFORM_H

“loginform.cpp”

#include "loginform.h"
#include "ui_loginform.h"loginform::UserType loginform::m_userType = loginform::UserType::User;  //默认状态为普通用户
bool loginform::m_loggedIn = false; //默认状态为非登录状态
QString loginform::m_userName = "";loginform::loginform(QWidget *parent) :QDialog(parent),ui(new Ui::loginform)
{ui->setupUi(this);ui->lineEdit_UserName->setFocus();
}loginform::~loginform()
{delete ui;
}bool loginform::loggedIn()
{return m_loggedIn;
}QString loginform::userName()
{return m_userName;
}loginform::UserType loginform::type()
{return m_userType;
}void loginform::on_buttonBox_accepted()
{m_userName = ui->lineEdit_UserName->text().trimmed();m_userType = UserType::Admin;m_loggedIn = true;
}void loginform::on_buttonBox_rejected()
{m_userName = ui->lineEdit_UserName->text().trimmed();m_userType = UserType::User;m_loggedIn = false;
}```cpp//用户登录connect(action2, &QAction::triggered, this, [=]{loginform loginform; //登录对话框int ret = loginform.exec();if(ret == QDialog::Accepted){QMessageBox::information(this,"用户登录提示", "用户已登录");qDebug()<<"user name:"<<loginform.userName()<<"user type:"<<loginform.type()<<"status:"<<loginform.loggedIn();}else{QMessageBox::information(this,"用户登录提示", "登录取消");qDebug()<<"user name:"<<loginform.userName()<<"user type:"<<loginform.type()<<"status:"<<loginform.loggedIn();}});

在这里插入图片描述

[4] sqlite3查询库里所有表名

原文链接:https://blog.csdn.net/weixin_41010318/article/details/81078234

查询与判断表

查询sqlite中所有表,可用如下sql语句。原理是,sqlite中有一个内建表sqlite_master,这个表中存储这所有自建表的表名称等信息。

select name from sqlite_master where type='table' order by name;

我们可以通过如下语句查看这个内建表的所有记录

select * from sqlite_master;

由此可以进一步引申:判断指定的表是否存在,可以用如下语句:

selectcount(*)  from sqlite_master wheretype='table' and name = 'yourtablename';

其中yourtablename表示你要判断的表名,如果查询结果大于0,表示该表存在于数据库中,否则不存在。

每一个 SQLite 数据库都有一个叫 SQLITE_MASTER 的表, 里面存储着数据库的数据结构(表结构、视图结构、索引结构等),只可以对他使用查询语句

SQLITE_MASTER 表DDL信息如下:

CREATE TABLE sqlite_master (type TEXT,name TEXT,tbl_name TEXT,rootpage INTEGER,sql TEXT);  

type 类型 (如表、视图、索引等) name 名称 tbl_name 所属表名称 SQL (表、视图、索引)的DDL语句

对于表来说,type 字段永远是 ‘table’,name 字段永远是表的名字。所以,要获得数据库中所有表的列表, 使用下列SELECT语句:

SELECT name FROM sqlite_master WHERE type=’table’ ORDER BY name;  

对于索引来说,type 等于 ‘index’, name 则是索引的名字,tbl_name 是该索引所属的表的名字, 使用下列SELECT语句:

SELECT name FROM sqlite_master WHERE type=’index’ ORDER BY name;  

对于视图来说,type 等于 ‘view’, name 则是视图的名字,tbl_name 是该视图所属的表的名字, 使用下列SELECT语句:

SELECT name FROM sqlite_master WHERE type=’view’ ORDER BY name; 

不管是表或视图还是索引,sql 字段是原先用 CREATE TABLE 、CREATE VIEW 或 CREATE INDEX 语句创建它们时的命令文本。对于自动创建的索引(用来实现 PRIMARY KEY 或 UNIQUE 约束),sql字段为NULL。

SQLITE_MASTER 表是只读的。不能对它使用 UPDATE、INSERT 或 DELETE。 它会被 CREATE TABLE、CREATE INDEX、DROP TABLE 和 DROP INDEX 命令自动更新。

通过以下语句可查询出某个表的所有字段信息

PRAGMA table_info([tablename])

例如 PRAGMA table_info(student)

注意 PRAGMA 必须大写

当然字段信息也可以从sql字段中获取

[5] 任务栏显示登录状态和系统时间

运行效果

在这里插入图片描述
在这里插入图片描述

源代码

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): SARibbonMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowIcon(QIcon(":/wework_task_bar_wedisk.ico"));this->resize(1024,600);SARibbon_Init();ui->stackedWidget->addWidget(&dlgAuthority);ui->stackedWidget->addWidget(&dlgSpanCal);ui->stackedWidget->addWidget(&dlgSystemSettings);ui->stackedWidget->addWidget(&dlgUserControl);ui->stackedWidget->addWidget(&dlgZeroCal);ui->stackedWidget->setCurrentWidget(&dlgUserControl);connect(ui->toolBtn_UserControl, &QToolButton::released, this, &MainWindow::on_toolBtn_UserControl);connect(ui->toolBtn_Authority, &QToolButton::released, this, &MainWindow::on_toolBtn_Authority);connect(ui->toolBtn_SystemSettings, &QToolButton::released, this, &MainWindow::on_toolBtn_SystemSettings);connect(ui->toolBtn_ZeroCal, &QToolButton::released, this, &MainWindow::on_toolBtn_ZeroCal);connect(ui->toolBtn_SpanCal, &QToolButton::released, this, &MainWindow::on_toolBtn_SpanCal);connect(&dlgAuthority, &DlgAuthority::sigBtn1_Clicked, this, [=](){this->resize(1280,800);});connect(&dlgUserControl, &DlgUserControl::sig_Btn1_Clicked, this, [=](){this->resize(1024,600);});//    connect(&dlgSpanCal, SIGNAL(sigTranslate(QString data)), this, SLOT(slotTranslate(QString data)));connect(&dlgSpanCal, &DlgSpanCal::sigTranslate, this, &MainWindow::slotTranslate);testAESCrypt();m_statusBar_Time.setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm"));m_statusBar_User.setText(tr("未登录"));statusBar()->addPermanentWidget(&m_statusBar_User);statusBar()->addPermanentWidget(&m_statusBar_Time);statusBar()->setSizeGripEnabled(false);//去掉状态栏右下角的三角connect(&m_timer, &QTimer::timeout, this, &MainWindow::slotTimerUpdate);m_timer.start(1000);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::SARibbon_Init()
{SARibbonBar *ribbon = ribbonBar();ribbon->setRibbonStyle(SARibbonBar::RibbonStyle::OfficeStyleTwoRow); //SARibbonBar::RibbonStyle::OfficeStyleribbon->setFont(QFont("微软雅黑", 12));ribbon->applicationButton()->setVisible(true);ribbon->applicationButton()->setText(("File"));//创建SARibbonCategory实例SARibbonCategory *categoryMain = new SARibbonCategory();categoryMain->setCategoryName("Category1");categoryMain->setObjectName("categoryMain");categoryMain->setFont(QFont("微软雅黑", 12));ribbon->addCategoryPage(categoryMain);SARibbonCategory *categoryMain2 = new SARibbonCategory();categoryMain2->setCategoryName("Category2");categoryMain2->setObjectName("categoryMain2");categoryMain2->setFont(QFont("微软雅黑", 12));ribbon->addCategoryPage(categoryMain2);//创建SARibbonPannel实例SARibbonPannel *pannel = categoryMain->addPannel("pannel1");//    QAction *action1 = new QAction("动作1");QAction *action1 = new QAction(QIcon(":/khetong.ico"), tr("动作1"));pannel->addLargeAction(action1);QAction *action2 = new QAction(QIcon(":/qq.ico"), tr("用户登录"));pannel->addLargeAction(action2);//创建SARibbonPannel实例SARibbonPannel *pannel2 = categoryMain2->addPannel("pannel2");QAction *action2_1 = new QAction(QIcon(":/ringtones.ico"), tr("动作2_1"));pannel2->addMediumAction(action2_1);QAction *action2_2 = new QAction(QIcon(":/sync.ico"), tr("动作2_2"));pannel2->addLargeAction(action2_2);//创建SARibbonPannel实例SARibbonPannel *pannel1_2 = categoryMain->addPannel("pannel1_2");QAction *action1_2 = new QAction(QIcon(":/ktaosj.ico"), tr("动作1_2"));pannel1_2->addLargeAction(action1_2);QAction *action1_3 = new QAction(QIcon(":/scan_property.ico"), tr("调用Windows屏幕键盘"));pannel1_2->addMediumAction(action1_3) ;//addLargeAction(action1_3);connect(action1, &QAction::triggered, this, [=]{QMessageBox::information(this,"action1消息提示", "这是一条消息提示内容");//        categoryMain2->setVisible(true);ribbon->showCategory(categoryMain2);//        pannel2->setVisible(true);action2_1->setVisible(true);});//用户登录connect(action2, &QAction::triggered, this, [=]{loginform loginform; //登录对话框int ret = loginform.exec();if(ret == QDialog::Accepted){switch (loginform.type()) {case 0: m_statusBar_User.setText(tr("操作员"));break;case 1: m_statusBar_User.setText(tr("管理员"));break;case 2: m_statusBar_User.setText(tr("超级管理员"));break;}qDebug()<<"user name:"<<loginform.userName()<<"user type:"<<loginform.type()<<"status:"<<loginform.loggedIn();}else{
//            QMessageBox::information(this,"用户登录提示", "登录取消");qDebug()<<"user name:"<<loginform.userName()<<"user type:"<<loginform.type()<<"status:"<<loginform.loggedIn();}});connect(action2_2, &QAction::triggered, this, [=]{QMessageBox::information(this,"action2_2消息提示", "这是一条消息提示内容");});connect(action2, &QAction::triggered, this, [=]{//        pannel2->setVisible(false);action2_1->setVisible(false);ribbon->hideCategory(categoryMain2);});connect(action1_3, &QAction::triggered, this, [=]{//        QDesktopServices::openUrl(QUrl("osk.exe", QUrl::TolerantMode));systemKeyboard();});
}void MainWindow::systemKeyboard()
{if(QOperatingSystemVersion::current() > QOperatingSystemVersion::Windows7)//版本大于win7{//win8.1   win10 下使用PVOID OldValue = nullptr;BOOL bRet = Wow64DisableWow64FsRedirection(&OldValue);QString csProcess = "C:\\Windows\\System32\\osk.exe";QString params="";ShellExecute(nullptr, L"open", (LPCWSTR)csProcess.utf16(), (LPCWSTR)params.utf16(), nullptr, SW_SHOWNORMAL);if (bRet){Wow64RevertWow64FsRedirection(OldValue);}}else{//只能在win7下使用QDesktopServices::openUrl(QUrl("osk.exe", QUrl::TolerantMode));}
}QString MainWindow::testCrypt(const QString& data)
{//    QCryptographicHash md5(QCryptographicHash::Md5); //使用MD5加密//    md5.addData(data.toUtf8(), data.size()); // 添加数据//    QByteArray ba = md5.result();  //获取MD5加密后的密码//    QString md5_hexData;//    md5_hexData.append(ba.toHex().toUpper());//    return md5_hexData;QCryptographicHash sha(QCryptographicHash::Sha1); //使用SHA1加密sha.addData(data.toUtf8(), data.size()); //添加数据QByteArray ba = sha.result(); //获取SHA1加密后的数据QString sha_hexData;sha_hexData.append(ba.toHex().toUpper()); //转换成16进制大写方式return sha_hexData;
}QString MainWindow::AES_encryption(const QString &data, const QString &key)
{QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray iv = QString("1234567812345678").toUtf8();QByteArray enBA = encryption.encode(data.toUtf8(), key.toUtf8(), iv);return QString::fromLatin1(enBA.toBase64());
}QString MainWindow::AES_decryption(const QString &data, const QString &key)
{QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray iv = QString("1234567812345678").toUtf8();QByteArray  enBA = QByteArray::fromBase64(data.toUtf8());QByteArray deBA = encryption.decode(enBA, key.toUtf8(), iv);return QString::fromLatin1(QAESEncryption::RemovePadding(deBA, QAESEncryption::PKCS7));
}void MainWindow::testAESCrypt()
{QString key = "0123456789012345";qDebug() << "key.size : " << key.toUtf8().size();QString string = "odfgoerhgeajgoierjhnao;jfoerihgoeraijgoerdfdfddf";QAESEncryption encryption(QAESEncryption::AES_128, QAESEncryption::CBC, QAESEncryption::PKCS7);QByteArray iv = QString("1234567812345678").toUtf8();QByteArray enBA = encryption.encode(string.toUtf8(), key.toUtf8(), iv);QByteArray enBABase64 = enBA.toBase64();qDebug() << "string : " << string;qDebug() << "enBA : " << enBABase64;enBA = QByteArray::fromBase64(enBABase64);QByteArray deBA = encryption.decode(enBA, key.toUtf8(), iv);//移除填充qDebug() << "deBA : " << QAESEncryption::RemovePadding(deBA, QAESEncryption::PKCS7);}void MainWindow::on_toolBtn_UserControl()
{ui->stackedWidget->setCurrentWidget(&dlgUserControl);
}void MainWindow::on_toolBtn_Authority()
{ui->stackedWidget->setCurrentWidget(&dlgAuthority);ui->toolBtn_SystemSettings->setVisible(false);
}void MainWindow::on_toolBtn_SystemSettings()
{ui->stackedWidget->setCurrentWidget(&dlgSystemSettings);
}void MainWindow::on_toolBtn_ZeroCal()
{ui->stackedWidget->setCurrentWidget(&dlgZeroCal);ui->toolBtn_SystemSettings->setVisible(true);
}void MainWindow::on_toolBtn_SpanCal()
{ui->stackedWidget->setCurrentWidget(&dlgSpanCal);
}void MainWindow::slotTranslate(QString data)
{QString str = testCrypt(data);qDebug()<<"crypt data: "<<str;
}void MainWindow::slotTimerUpdate()
{
static uint32_t cnt = 0;
cnt++;
if(cnt%60 == 0) //时间每分钟更新一次
{m_statusBar_Time.setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm"));
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58795.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于类的探索(2)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 关于类的探索&#xff08;2&#xff09; 前言前提两种学习方法先从一个例子开始稍微优化一下输出模块数据函数类类的继承关系类的内部解析收尾事项 前言 很久就想写一个关于python类…

web面试题记录之react

为什么使用hooks class 在组件之间复用状态逻辑很难&#xff0c;由高阶组件&#xff0c;render props 等其他抽象层组成的组件会形成“嵌套地狱”。&#xff5c; Hook 从组件中提取状态逻辑&#xff0c; 使得这些逻辑可以单独复用 【拆分】class 组件不好理解&#xff0c; 每个…

[streamlit]数据科学科研工作者的神器,必须要推荐一下

1. 前言 做科研当然要有过硬的专业知识&#xff0c;但是也少不了一些辅助&#xff0c;才能最大程度发挥我们的能力。因此&#xff0c;除去我们模型性能优秀&#xff0c;结果良好以外&#xff0c;如何进行一个好的展示&#xff0c;也是非常有必要的。那么今天&#xff0c;我们就…

大模型高效微调综述上:Adapter Tuning、AdaMix、PET、Prefix-Tuning、Prompt Tuning、P-tuning、P-tuning v2

文章目录 一、背景1.1 Tansformer1.1.1 模型结构1.1.2 注意力机制1.1.3 注意力在Transformer中的应用 1.2 BERT 二、PEFT综述2.1 PEFT的分类2.2 不同PEFT方法的对比 三、Additive methods3.1 Adapter Tuning3.1.1 Adapters&#xff08;2019.2.2&#xff09;3.1.2 AdaMix&#x…

AR眼镜——Vuzix Blade填坑笔记

这是市场给挖的坑&#xff01;&#xff01; 手里的一个项目&#xff0c;由于商务环节历时1年半的时间&#xff0c;到项目签合同的时候&#xff0c;公司的产品线布局变化极大&#xff0c;我已经很久没做过AR相关的项目了&#xff0c;一直在做VR的东西。合同签完拿给我过参数&…

【人脸识别】VGGFace2数据集介绍

论文题目&#xff1a;&#xff1a;《VGGFace2: A dataset for recognising faces across pose and age》 论文地址&#xff1a;https://arxiv.org/pdf/1710.08092.pdf 1. 简介 VGGFace2是一个大规模人脸识别数据集&#xff0c;包含331万图片&#xff0c;9131个ID&#xff0c;平…

window.postMessage()接收不到信息(失效)

问题描述 按照正常的代码逻辑&#xff0c;应该是这个样子&#xff0c;通过iframe打开子窗口&#xff0c;能够正常通信。 // 接收端&#xff08;父窗口&#xff09; window.onmessage function (e) {// 逻辑代码 }// 发送端&#xff08;子窗口&#xff09; window.parent.po…

什么是人工智能在金融领域的应用?

人工智能在金融领域有很多应用&#xff0c;下面是一些例子&#xff1a; 什么是人工智能在金融领域的应用 风险评估&#xff1a;人工智能可以帮助金融机构评估贷款和投资的风险&#xff0c;例如通过分析借款人或投资对象的信用历史、收入、资产等信息来判断其还款能力和投资回报…

人工智能(AI)在金融行业的应用

人工智能&#xff08;AI&#xff09;技术在金融行业的应用日益广泛&#xff0c;为金融机构提供了更高效、更智能的解决方案。以下和大家分享AI在金融行业的一些主要应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

那些似小实大的工作

上周末在厦门&#xff0c;我跟传奇个人站长高春辉联合在爱特咖啡搞了一场分享会&#xff0c;老高继续巡回分享他ip库的意义和发展历程。 那我分享的时候&#xff0c;就先替老高补充了一个案例&#xff0c;我说2004年底进入百度&#xff0c;2005年初转入商业产品部&#xff0c;然…

新手小白学JAVA 面向对象之多态

多态 1. 概念 多态是面向对象程序设计&#xff08;OOP&#xff09;的一个重要特征&#xff0c;指同一个实体同时具有多种形式&#xff0c;即同一个对象&#xff0c;在不同时刻&#xff0c;代表的对象不一样&#xff0c;指的是对象的多种形态。 可以把不同的子类对象都当作父…

Flask 安装与基础结构

Flask介绍&#xff1a; Flask 是由python开发的轻量的web框架&#xff0c;小巧、灵活。一个脚本就可以启动web项目。 Flask部署&#xff1a; 1、创建虚拟环境 命令行输入&#xff1a;conda -create -n 项目名 Python版本号 启动虚拟环境 activate 环境名 2、安装flask框…

小学生智力测试软件,考验小学生的智商测试,全答对算你厉害

这几年来&#xff0c;小学生的题目让很多人脑筋急转还是弯不过来&#xff0c;答不上。要是小学生能够答出来了而你不能&#xff0c;那你会不会觉得自己的智商遭到了碾压&#xff1f;肯定会吧&#xff01;想不想扳回&#xff1f;想的话就赶紧把这道智商测试题做了吧&#xff0c;…

再看SimCSE

一、概述 二、要点分析原始ppt解读 2.1 作用&#xff1a;语义表达作用检索聚类 2.2 简述&#xff1a;简单的对比学习来做语义表征 预训练对比学习&#xff1a;最佳的语义表征方法 无监督&#xff1a;dropout有监督&#xff1a;NLI 蕴含矛盾数据 原理&#xff1a; 利用对比学习…

MIT最新成果:这款能「自我复制」的机器人,从飞机到火箭都能自己造!

来源&#xff1a;新智元 本文约2300字&#xff0c;建议阅读5分钟科幻成真&#xff01;《超能陆战队》里能自我复制的微型机器人&#xff0c;被MIT造出来了&#xff1f; 现在的机器人&#xff0c;能力究竟有多离谱&#xff1f; 实在难以想象&#xff0c;就连造飞机、造火箭都成了…

PowerGram:一款功能强大的跨平台Telegram Bot工具

关于PowerGram PowerGram是一款功能强大的跨平台Telegram Bot工具&#xff0c;该工具基于纯PowerShell开发&#xff0c;支持在Windows、Linux和macOS系统上运行。如需使用PowerGram&#xff0c;只需要安装PowerShell 4或更高版本并连接网络即可。 Bot和Telegram服务器之间的所…

HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源码泄露

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共14年] 职业生涯: 12年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、E…

Transformers 如何模仿大脑的某些部分

来源&#xff1a;ScienceAI 编译&#xff1a;白菜叶 了解大脑如何组织和访问空间信息「我们在哪里」&#xff0c;「拐角处有什么」&#xff0c;「如何到达那里」&#xff0c;这仍然是一项艰巨的挑战。该过程涉及从数百亿个神经元中调用整个记忆网络和存储的空间数据&#xff0c…

攻防世界_Crypto_告诉你个秘密

攻防世界刷题记录Crypto篇 文章目录 攻防世界刷题记录Crypto篇解题步骤1.下载题目附件查看内容2.借助Python来解码3.从键盘上找到每组字母包围的字母 解题步骤 1.下载题目附件查看内容 如图所示&#xff0c;题目附件给出的是一个txt文件里面有两行字符串。因为只有不超过F的大…

来自Transformer + Bert + GPT 的灵魂拷问

Transformer Q&#xff1a;Transformer如何解决梯度消失问题的? A&#xff1a;残差连接 Q&#xff1a;为何Transformer中使用Layer Normalization而不用Batch Normalization? A&#xff1a;BatchNorm是对一个batch-size样本内的每个特征做归一化&#xff0c;LayerNorm是对每…