QT:独自のQTプログラムのログインインターフェイスを追加します

プライベートな仕事をして、終わってからこの機能を追加しなければならなかったので、自分でやってみました。モジュールはすべて独立していて、メインインターフェースとはあまり関係ありません。メインインターフェースは基本的に変わりません。一般的に、それはまだ私が考えている方法です。それはあまり専門的ではないかもしれませんが、一般的にそれは単純で速いです。

ここに画像の説明を挿入
追加が必要なログインシステムには、ソースコードで記述されたソフトウェアにパスワードを追加するのと同等の登録機能がありません。

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()));
}

おすすめ

転載: blog.csdn.net/sazass/article/details/109445117