QT: agregue una interfaz de inicio de sesión para su propio programa QT

Tomé un trabajo privado y tuve que agregar esta función después de terminarlo. Intenté hacerlo yo mismo. Los módulos son todos independientes y no estarán muy relacionados con la interfaz principal. La interfaz principal básicamente no ha cambiado. En general, todavía es un método en el que estoy pensando, puede que no sea muy profesional, pero en general es sencillo y rápido.

Inserte la descripción de la imagen aquí
El sistema de inicio de sesión que debe agregarse no tiene una función de registro, lo que equivale a agregar una contraseña al software, que está escrita en el código fuente.

1. Cree una nueva interfaz de usuario

Haga clic con el botón derecho en el directorio del proyecto y elija Add Newcrear un nuevo archivo:
Inserte la descripción de la imagen aquí

La interfaz en blanco es suficiente, podemos agregar controles nosotros mismos
Inserte la descripción de la imagen aquí

Establezca el nombre y luego podrá.

Inserte la descripción de la imagen aquí

2. Abra la página de diseño de la interfaz de usuario, arrastre los controles y diseñe la interfaz.

Inserte la descripción de la imagen aquí

Luego diseñe la siguiente interfaz:

Inserte la descripción de la imagen aquí
Los controles totales arrastrados son los siguientes:
Inserte la descripción de la imagen aquí
En cuanto al diseño de la página, puede configurarlo manualmente en la interfaz de diseño de la interfaz de usuario, o puede configurarlo en logwidget.cppel código debajo del archivo, de acuerdo con sus propios hábitos:

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. Cómo iniciar sesión en la interfaz principal a través de la interfaz de inicio de sesión

De hecho, las dos primeras partes son irrelevantes, la parte central comienza aquí.
El código de función principal que usamos para abrir la interfaz principal es generalmente:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Pero el efecto que queremos hacer ahora es abrir primero la interfaz de inicio de sesión y luego ingresar a la interfaz principal de acuerdo con el botón de la interfaz de inicio de sesión;
mi método es:
1. Crear el objeto de interfaz de inicio de sesión LogWidget cuando se inicializa el objeto MainWindow, y llamar al método show del objeto LogWidget.
2. La función principal no llama a la función show () del objeto MainWindow, pero envía una señal a través del botón de inicio de sesión LogWidget a través del mecanismo de ranura de señal, y luego llama al método show de MainWindow
3. También a través del mecanismo de ranura de señal, el botón de inicio de sesión de LogWidget Después de enviar la señal, llame a la función close () de LogWidget para cerrar la interfaz de inicio de sesión después de iniciar sesión en la interfaz principal.

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. Configure la cuenta y la contraseña de la interfaz de inicio de sesión.

Esta idea se determina de acuerdo con las necesidades reales En mi situación actual, simplemente las escribo en el código. Luego, obtenga los datos del cuadro de entrada y compárelos con la contraseña incorporada.

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
modificar el evento de activación del botón de inicio de sesión 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. Realice la función de recordar la cuenta y recordar la contraseña

Esta función requiere que almacenemos parte de la información como un archivo de configuración, el programa la lee durante la inicialización y luego ejecuta la configuración correspondiente.

Idea básica:
1. Cree un archivo json
. 2. El archivo json se leerá cuando se inicialice la interfaz de inicio de sesión.
3. De acuerdo con los datos del archivo json, si la cuenta y la contraseña se completan automáticamente, y la casilla de verificación es automáticamente marcado
4. Cada vez que se activa el botón de inicio de sesión, si el inicio de sesión es exitoso, vuelva a escribir el archivo json de acuerdo con la casilla de verificación de la casilla de verificación nuevamente.

json configuración de archivo
Inserte la descripción de la imagen aquí
SAVE_NAME valor de clave correspondiente 0 significa no guardar la cuenta, 1 significa guardar la cuenta;
SAVE_PASSWORD valor de clave correspondiente 0 significa no guardar la contraseña, 1 significa guardar la contraseña;

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. El código final completo:

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 (contenido irrelevante omitido)

#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 (omitir contenido irrelevante)

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

Supongo que te gusta

Origin blog.csdn.net/sazass/article/details/109445117
Recomendado
Clasificación