プライベートな仕事をして、終わってからこの機能を追加しなければならなかったので、自分でやってみました。モジュールはすべて独立していて、メインインターフェースとはあまり関係ありません。メインインターフェースは基本的に変わりません。一般的に、それはまだ私が考えている方法です。それはあまり専門的ではないかもしれませんが、一般的にそれは単純で速いです。
追加が必要なログインシステムには、ソースコードで記述されたソフトウェアにパスワードを追加するのと同等の登録機能がありません。
基本的なプロセスは次のとおりです。
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.ログインインターフェイスを介してメインインターフェイスにログインする方法
実際、最初の2つの部分は無関係であり、コア部分はここから始まります。
メインインターフェイスを開くために使用した主な機能コードは、一般的に次のとおりです。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
しかし、ここで作成したい効果は、最初にログインインターフェイスをポップアップし、次にログインインターフェイスボタンに従ってメインインターフェイスに入るというものです。
私の方法は次のとおり
です。1。MainWindowオブジェクトが初期化されたときにログインインターフェイスオブジェクトLogWidgetを作成します。 LogWidgetオブジェクトのshowメソッドを呼び出します。
2. main関数は、MainWindowオブジェクトのshow()関数を呼び出しませんが、シグナルスロットメカニズムを介してLogWidgetログインボタンを介してシグナルを送信し、次にMainWindow
3のshowメソッドを呼び出します。また、シグナルスロットメカニズムを介して、 LogWidgetログインボタンシグナルを送信した後、LogWidgetのclose()関数を呼び出して、メインインターフェイスにログインした後にログインインターフェイスを閉じます。
logwidget.h
namespace Ui {
class LogWidget;
}
class LogWidget : public QWidget
{
Q_OBJECT
public:
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_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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.ログインインターフェースのアカウントとパスワードを設定します
このアイデアは実際のニーズに応じて決定されます。私の現在の状況では、これらをコードに記述するだけです。次に、入力ボックスのデータを取得し、組み込みのパスワードと比較します。
namespace Ui {
class LogWidget;
}
class LogWidget : public QWidget
{
Q_OBJECT
public:
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ファイル設定
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_OBJECT
public:
explicit LogWidget(QWidget *parent = nullptr);
~LogWidget();
void read_json(); //读json
void write_json();//写json
void 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());
}
else
QMessageBox::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";
}
else
obj["SAVE_NAME"] = "0";
flag = ui->check_pw->isChecked();
if(flag == true)
{
obj["SAVE_PASSWORD"] = "1";
}
else
obj["SAVE_PASSWORD"] = "0";
QJsonDocument jdoc(obj);
file.write(jdoc.toJson());
file.flush();
}
6.最終的な完全なコード:
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_OBJECT
public:
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 = "wuyongwen";
m_password = "wuyongwen";
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());
}
else
QMessageBox::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";
}
else
obj["SAVE_NAME"] = "0";
flag = ui->check_pw->isChecked();
if(flag == true)
{
obj["SAVE_PASSWORD"] = "1";
}
else
obj["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("wuyongwen");
ui->check_name->setChecked(true);
}
if(flag2 == "1")
{
ui->edit_pw->setText("wuyongwen");
ui->check_pw->setChecked(true);
}
}
mainwindow.h(無関係なコンテンツは省略)
#include "logwidget.h"
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
LogWidget * m_log;
}
mainwindow.cpp(無関係なコンテンツを省略)
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()));
}