QT: 为自己的QT程序添加一个登录界面
接了一个私活,做完后非要加一个这个功能,自己尝试着做了一下,模块都是独立的,不会和主界面有多少关联,主界面也基本没有改动。总体上还是属于自己瞎琢磨的一个方法,可能不是非常的专业,不过总体上就是简单快捷。
需要加的这个登录系统并没有注册功能,等同于给软件加了一个密码,密码写在源码里。
这里写目录标题
- 1.创建一个新的ui界面
- 2.打开ui设计页面,拖动控件,布置界面。
- 3.如何通过登录界面登录主界面
- 4.设置登录界面的账号和密码
- 5.实现记住账号和记住密码功能
- 6. 防止主窗口和登录窗口同时打开
- 7.最终完整代码:
- 8. 源码分享
1.创建一个新的ui界面
右击项目目录,选择Add New
创建新文件:
空白界面即可,我们可以自己加控件
设置名称,然后即可。
2.打开ui设计页面,拖动控件,布置界面。
然后设计如下界面:
总共拖到的控件如下:
至于页面布局,可以在ui设计界面手动设置,或者可以在logwidget.cpp
文件下代码设置,根据自己习惯定:
void LogWidget::form_init()
{// 文件标题名ui->label_title->setGeometry(120,25,160,25);ui->groupBox->setGeometry(50,60,300,125);ui->label_name->setGeometry(25,25,100,25);ui->edit_name->setGeometry(125,25,150,25);ui->label_pw->setGeometry(25,75,100,25);ui->edit_pw->setGeometry(125,75,150,25);ui->check_name->setGeometry(85,200,100,25);ui->check_pw->setGeometry(215,200,100,25);ui->btn_log->setGeometry(50,235,120,30);ui->btn_clear->setGeometry(230,235,120,30);//调整字体大小QFont font;font.setPointSize(16); //实际上是16的字号,但设成16却不行font.setFamily(("wenquanyi"));font.setBold(false);ui->label_title->setFont(font);font.setPointSize(12);ui->label_name->setFont(font);ui->label_pw->setFont(font);
}
3.如何通过登录界面登录主界面
其实前两个部分都是无关紧要的,核心部分从这里开始。
我们之前打开主界面的主函数代码一般都是:
int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
但我们现在要做出的效果是,先弹出登录界面,然后根据登录界面的按钮进入主界面;
我的方法是:
1.在MainWindow 对象初始化时创建登录界面对象LogWidget,并调用LogWidget对象的show方法。
2.主函数中并不调用MainWindow 对象的show()函数,而是通过信号槽机制,通过LogWidget的登录按钮发出信号,然后调用到MainWindow的show方法
3.同样通过信号槽机制,LogWidget的登录按钮发出信号之后,调用LogWidget的close()函数,实现登录主界面后的登录界面关闭。
logwidget.h
namespace Ui {
class LogWidget;
}class LogWidget : public QWidget
{Q_OBJECTpublic:explicit LogWidget(QWidget *parent = nullptr);~LogWidget();signals:void login(); //登录主界面信号void close_window(); //关闭登录界面信号public slots:void btn_clear_clicked(); //重置按钮按下后触发的事件void btn_log_clicked(); //登录按钮按下后触发的事件private:Ui::LogWidget *ui;
};
logwidget.cpp
LogWidget::LogWidget(QWidget *parent) :QWidget(parent),ui(new Ui::LogWidget)
{ui->setupUi(this);// connect 3个信号槽// 触发重置按钮的信号槽连接connect(ui->btn_clear,SIGNAL(clicked()),this,SLOT(btn_clear_clicked()));// 触发登录按钮的信号槽连接connect(ui->btn_log,SIGNAL(clicked()),this,SLOT(btn_log_clicked()));// 发出信号后关闭登录窗口的信号槽连接connect(this,SIGNAL(close_window()),this,SLOT(close()));
}// 清理输入栏
void LogWidget::btn_clear_clicked()
{ui->edit_pw->clear();ui->edit_name->clear();
}// 登录按钮触发事件
void LogWidget::btn_log_clicked()
{ // 发出登录信号emit(login());// 发出关闭窗口信号emit(close_window());
}
mainwindow.h
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;// 登录界面类的对象作为指针LogWidget * m_log;};
#endif // MAINWINDOW_H
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 通过指针创建登录界面类的对象m_log = new LogWidget;// 调用登录窗口的show()函数显示登录界面m_log->show();// 建立信号槽,到接收到登录界面发来的login()信号后,调用主窗口的show()函数。connect(m_log,SIGNAL(login()),this,SLOT(show()));}
4.设置登录界面的账号和密码
这个思路根据实际需求来定,目前我的情况,只是把这些在代码里写死即可。然后获取输入框的数据,和内置密码进行比对。
其实更常规的做法,应该时设置一个账号密码的数据库,简单一点就是设置一个json文件或者txt文件,采用文件读取的方式。
namespace Ui {
class LogWidget;
}class LogWidget : public QWidget
{Q_OBJECTpublic:explicit LogWidget(QWidget *parent = nullptr);~LogWidget();signals:void login(); //登录主界面信号void close_window(); //关闭登录界面信号public slots:void btn_clear_clicked(); //重置按钮按下后触发的事件void btn_log_clicked(); //登录按钮按下后触发的事件private:Ui::LogWidget *ui;QString m_username; // 自己设定的账号QString m_password; // 自己设定的密码
};
logwidget.cpp
修改登录按钮触发事件btn_log_clicked()
LogWidget::LogWidget(QWidget *parent) :QWidget(parent),ui(new Ui::LogWidget)
{ui->setupUi(this);// connect// 触发重置按钮的信号槽连接connect(ui->btn_clear,SIGNAL(clicked()),this,SLOT(btn_clear_clicked()));// 触发登录按钮的信号槽连接connect(ui->btn_log,SIGNAL(clicked()),this,SLOT(btn_log_clicked()));// 发出信号后关闭登录窗口的信号槽连接connect(this,SIGNAL(close_window()),this,SLOT(close()));ui->edit_pw->setEchoMode(QLineEdit::Password);//输入的时候就显示圆点m_username = "wuyongwen";m_password = "wuyongwen";}void LogWidget::btn_log_clicked()
{ // 从输入框获取账号QString name = ui->edit_name->text();// 从输入框获取密码QString password = ui->edit_pw->text();//账号和密码匹配正确if (name == m_username && password == m_password){emit(login());emit(close_window());}else // 账号或密码错误QMessageBox::information(this, "Warning","Username or Password is wrong !");
}
5.实现记住账号和记住密码功能
这种功能需要我们把一部分信息存储为配置文件,程序在初始化时进行读取,然后执行对应设置。
基本思路:
1.创建一个json文件
2.登录界面初始化时会读取json文件
3.根据json文件数据觉得是否自动填入账号和密码,并在多选框内自动打勾
4.每次触发登录按钮,假如成功登录,就再一次根据多选框的打勾情况,重新写入json文件。
(在本显示代码中,设置的json存取路径为当前的项目包路径(QApplication::applicationDirPath()+"/config.json"),可以自行替换json文件的路径)
json文件设置
SAVE_NAME对应键值0表示不保存账号,1表示保存账号;
SAVE_PASSWORD对应键值0表示不保存密码,1表示保存密码;
logwidget.h
#include <QWidget>
#include <QMessageBox>
#include <QJsonDocument>
#include <QFile>
#include <QDebug>
#include <QJsonObject>
#include <QByteArray>namespace Ui {
class LogWidget;
}class LogWidget : public QWidget
{Q_OBJECTpublic:explicit LogWidget(QWidget *parent = nullptr);~LogWidget();void read_json(); //读jsonvoid write_json();//写jsonvoid message_init(QString flag1,QString flag2);//根据json内容决定是否填充输入框signals:void login(); //登录主界面信号void close_window(); //关闭登录界面信号public slots:void btn_clear_clicked(); //重置按钮按下后触发的事件void btn_log_clicked(); //登录按钮按下后触发的事件private:Ui::LogWidget *ui;QString m_username;QString m_password;};
logwidget.cpp
#include "logwidget.h"
#include "ui_logwidget.h"LogWidget::LogWidget(QWidget *parent) :QWidget(parent),ui(new Ui::LogWidget)
{ui->setupUi(this);
// connect// 触发重置按钮的信号槽连接connect(ui->btn_clear,SIGNAL(clicked()),this,SLOT(btn_clear_clicked()));// 触发登录按钮的信号槽连接connect(ui->btn_log,SIGNAL(clicked()),this,SLOT(btn_log_clicked()));// 发出信号后关闭登录窗口的信号槽连接connect(this,SIGNAL(close_window()),this,SLOT(close()));ui->edit_pw->setEchoMode(QLineEdit::Password);//输入的时候就显示圆点m_username = "wuyongwen";m_password = "wuyongwen";// 读取json文件read_json();
}void LogWidget::read_json()
{//打开文件QFile file(QApplication::applicationDirPath()+"/config.json");if(!file.open(QIODevice::ReadOnly)) {qDebug() << "File open failed!";} else {qDebug() <<"File open successfully!";}QJsonDocument jdc(QJsonDocument::fromJson(file.readAll()));QJsonObject obj = jdc.object();QString save_name_flag=obj.value("SAVE_NAME").toString();QString save_password_flag=obj.value("SAVE_PASSWORD").toString();message_init(save_name_flag,save_password_flag);
}//根据json内容决定是否填充输入框
void LogWidget::message_init(QString flag1,QString flag2)
{//qDebug() << flag1 << "^^^" << flag2 ;if (flag1 == "1"){ui->edit_name->setText("wuyongwen");ui->check_name->setChecked(true);}if(flag2 == "1"){ui->edit_pw->setText("wuyongwen");ui->check_pw->setChecked(true);}
}// 清理输入栏
void LogWidget::btn_clear_clicked()
{ui->edit_pw->clear();ui->edit_name->clear();
}//登录按钮按下后触发的事件
void LogWidget::btn_log_clicked()
{QString name = ui->edit_name->text();QString password = ui->edit_pw->text();if (name == m_username && password == m_password){emit(login());write_json();emit(close_window());}elseQMessageBox::information(this, "Warning","Username or Password is wrong !");
}// 更新json文件
void LogWidget::write_json()
{QFile file(QApplication::applicationDirPath()+"/config.json");if(!file.open(QIODevice::WriteOnly)) {qDebug() << "File open failed!";} else {qDebug() <<"File open successfully!";}QJsonObject obj;bool flag = ui->check_name->isChecked();if(flag == true){obj["SAVE_NAME"] = "1";}elseobj["SAVE_NAME"] = "0";flag = ui->check_pw->isChecked();if(flag == true){obj["SAVE_PASSWORD"] = "1";}elseobj["SAVE_PASSWORD"] = "0";QJsonDocument jdoc(obj);file.write(jdoc.toJson());file.flush();
}
6. 防止主窗口和登录窗口同时打开
在main.cpp主函数中,注释掉主窗口的show()函数:
main.cpp:
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;
// w.show();return a.exec();
}
7.最终完整代码:
logwidget.h
#ifndef LOGWIDGET_H
#define LOGWIDGET_H#include <QWidget>
#include <QMessageBox>
#include <QJsonDocument>
#include <QFile>
#include <QDebug>
#include <QJsonObject>
#include <QByteArray>namespace Ui {
class LogWidget;
}class LogWidget : public QWidget
{Q_OBJECTpublic:explicit LogWidget(QWidget *parent = nullptr);~LogWidget();void form_init(); //格式初始化void func_init(); //功能初始化void read_json();void write_json();void message_init(QString flag1,QString flag2);signals:void login(); //登录主界面信号void close_window(); //关闭登录界面信号public slots:void btn_clear_clicked(); //重置按钮按下后触发的事件void btn_log_clicked(); //登录按钮按下后触发的事件private:Ui::LogWidget *ui;QString m_username;QString m_password;};
#endif // LOGWIDGET_H
logwidget.cpp
#include "logwidget.h"
#include "ui_logwidget.h"LogWidget::LogWidget(QWidget *parent) :QWidget(parent),ui(new Ui::LogWidget)
{ui->setupUi(this);form_init();func_init();
}LogWidget::~LogWidget()
{delete ui;
}void LogWidget::form_init()
{// 文件标题名ui->label_title->setGeometry(120,25,160,25);ui->groupBox->setGeometry(50,60,300,125);ui->label_name->setGeometry(25,25,100,25);ui->edit_name->setGeometry(125,25,150,25);ui->label_pw->setGeometry(25,75,100,25);ui->edit_pw->setGeometry(125,75,150,25);ui->check_name->setGeometry(85,200,100,25);ui->check_pw->setGeometry(215,200,100,25);ui->btn_log->setGeometry(50,235,120,30);ui->btn_clear->setGeometry(230,235,120,30);//调整字体大小QFont font;font.setPointSize(16); //实际上是16的字号,但设成16却不行font.setFamily(("wenquanyi"));font.setBold(false);ui->label_title->setFont(font);font.setPointSize(12);ui->label_name->setFont(font);ui->label_pw->setFont(font);
}void LogWidget::func_init()
{// connect// 触发重置按钮的信号槽连接connect(ui->btn_clear,SIGNAL(clicked()),this,SLOT(btn_clear_clicked()));// 触发登录按钮的信号槽连接connect(ui->btn_log,SIGNAL(clicked()),this,SLOT(btn_log_clicked()));// 发出信号后关闭登录窗口的信号槽连接connect(this,SIGNAL(close_window()),this,SLOT(close()));ui->edit_pw->setEchoMode(QLineEdit::Password);//输入的时候就显示圆点m_username = "sazass";m_password = "123456";read_json();
}// 清理输入栏
void LogWidget::btn_clear_clicked()
{ui->edit_pw->clear();ui->edit_name->clear();
}void LogWidget::btn_log_clicked()
{QString name = ui->edit_name->text();QString password = ui->edit_pw->text();if (name == m_username && password == m_password){emit(login());write_json();emit(close_window());}elseQMessageBox::information(this, "Warning","Username or Password is wrong !");}void LogWidget::read_json()
{//打开文件QFile file(QApplication::applicationDirPath()+"/config.json");if(!file.open(QIODevice::ReadOnly)) {qDebug() << "File open failed!";} else {qDebug() <<"File open successfully!";}QJsonDocument jdc(QJsonDocument::fromJson(file.readAll()));QJsonObject obj = jdc.object();QString save_name_flag=obj.value("SAVE_NAME").toString();QString save_password_flag=obj.value("SAVE_PASSWORD").toString();message_init(save_name_flag,save_password_flag);}void LogWidget::write_json()
{QFile file(QApplication::applicationDirPath()+"/config.json");if(!file.open(QIODevice::WriteOnly)) {qDebug() << "File open failed!";} else {qDebug() <<"File open successfully!";}QJsonObject obj;bool flag = ui->check_name->isChecked();if(flag == true){obj["SAVE_NAME"] = "1";}elseobj["SAVE_NAME"] = "0";flag = ui->check_pw->isChecked();if(flag == true){obj["SAVE_PASSWORD"] = "1";}elseobj["SAVE_PASSWORD"] = "0";QJsonDocument jdoc(obj);file.write(jdoc.toJson());file.flush();
}void LogWidget::message_init(QString flag1,QString flag2)
{//qDebug() << flag1 << "^^^" << flag2 ;if (flag1 == "1"){ui->edit_name->setText("sazass");ui->check_name->setChecked(true);}if(flag2 == "1"){ui->edit_pw->setText("123456");ui->check_pw->setChecked(true);}
}
mainwindow.h(省略无关内容)
#include "logwidget.h"
#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
private:Ui::MainWindow *ui;LogWidget * m_log;
};
mainwindow.cpp(省略无关内容)
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m_log = new LogWidget;m_log->show();// 注意,这个信号槽的作用就是激活主窗口的,我们已经让主窗口不可以自动打开,// 必须通过登录窗口中登录按钮发出的信号槽的信号才能打开connect(m_log,SIGNAL(login()),this,SLOT(show()));
}MainWindow::~MainWindow()
{delete ui;
}
main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;// 这边把主窗口的show()函数,这样主窗口就不会自动打开,// 必须通过登录窗口发出的信号,才能启动主窗口的show()函数。
// w.show();return a.exec();
}
8. 源码分享
链接:https://pan.baidu.com/s/1gjTUdTLz0FXSRnqQq21Xiw?pwd=ot98
提取码:ot98
–来自百度网盘超级会员V5的分享
QT: 为自己的QT程序添加一个登录界面相关推荐
- label qt 自动换行_QT编写一个登录界面
前言 继上篇:一起学Qt之基础篇---入门 今天上手实操用QT编写一个登录界面~ 系统权限这个词大家肯定不陌生,你进入一个网站也是,如果不登录,就是以游客的身份进去的,要想看到某些信息肯定需要进行登录 ...
- wxWidgets:编写一个应用程序 - 添加一个按钮
wxWidgets:编写一个应用程序 - 添加一个按钮 wxWidgets:编写一个应用程序 - 添加一个按钮 wxWidgets:编写一个应用程序 - 添加一个按钮 感谢您阅读本教程至少到此为止.在 ...
- 集成spring mvc_向Spring MVC Web应用程序添加社交登录:集成测试
集成spring mvc 我已经写了关于为使用Spring Social 1.1.0的应用程序编写单元测试的挑战,并为此提供了一种解决方案 . 尽管单元测试很有价值,但它并不能真正告诉我们我们的应用程 ...
- 【Qt Quick聊天软件练习】二、登录界面搭建
目录 1 主界面 2 创建登录面板qml文件 3 补充 ✨结语✨ 1 主界面 大概长成这样 2 创建登录面板qml文件 新建一个qml文件命名为LoginPanel.qml,首先先把右上角两个圆圈搓出 ...
- 一步步展示如何用C#和ACCESS编写一个登录界面
** 登录界面简易教程 ** 前段时间老师要求做一个登录界面来熟悉C#的操作,于是在看了很多文章后终于编出一个小程序.为了让以后入门的新手不用再找一大堆的文章来慢慢摸索,现在决定分享一下我的编写过程, ...
- 写一个登录界面——用窗体界面实现
写一个登录界面--用窗体界面实现 我们在上网的时候总能看到各种各样的窗体界面,比如:网页角落突然弹出的小广告.登录界面.画图板--接下来我就来讲讲如何创建一个窗体界面并制作一个登录界面. 窗体类的英文 ...
- 【tkinter探索之旅】小试牛刀:编写一个登录界面
文章目录 一.前言废话 二.设计分析 三.代码分步解析 1. 导入工具库 2. 创建应用程序窗口 3. 创建画布放置图片 4. 创建账号密码的标签 5. 创建文本框组件 6. 创建按钮组件 7. 设置 ...
- vue 创建一个登录界面
vue创建一个登录界面 (1)创建登录界面和主页 (2)配置路由 (3)配置main.js (4)配置App.vue (5)登录页面 (6)主页面 用到的组件 参考链接 (1)创建登录界面和主页 打开 ...
- flutter 登录和退出登录_Flutter从入门到奔溃(一):撸一个登录界面
Flutter从入门到奔溃(一):撸一个登录界面 前记 跨平台开发目前有3种途径:ReactNative,Weex,Flutter,至于他们之间的区别以及如何取舍,我觉得这在移动端工程师的圈子里已经讨 ...
最新文章
- Ruby用SciTE输出中文报错问题解决
- 重温WCF之会话Session(九)
- 论文笔记:Autoregressive Tensor Factorizationfor Spatio-temporal Predictions
- neo4j 修改密码
- 大兴计算机职业学校,北京大兴区第一职业学校
- 自然语言系列学习之表示学习与知识获取(七)利用关系路径进行关系抽取
- 写lua时需要注意的地方
- MySQL5安装配置笔记【超详细】
- 什么时候出python4_什么?Python4要来了?快来看看Python之父怎么说
- 基于生成对抗的知识图谱零样本关系学习 AAAI2020
- struts2.2跟jstl怎么整合
- python开发助理s_如何使用Python构建自己的AI个人助理
- 蓝桥杯 入门训练 Fibonacci数列 JAVA
- win7 破解后找不到活动分区以及bootmsr missing
- python流水灯简单程序_简单流水灯的实现程序
- excel排名_表格技巧—如何在Excel中快速计算排名
- 初识CMake,如何编写一个CMake工程(下)
- 关于Java你不知道的那些事之等等与equals的区别
- Unity—JsonFx序列化场景
- 除了we tool还有哪些免费安全好用的微信群发软件?这两个软件比we tool好用!