Resuelva el problema del cambio de interfaz de interfaz de usuario de tipo Qt Widget a la vez (el más simple)

Este artículo es muy adecuado para mi estudio de principiantes, revíselo con atención.
Nota: ¡El código es solo para aprendizaje, no para uso comercial!

1. La interfaz principal de la interfaz de usuario de Qt Widget llama a la interfaz secundaria

Una solución más común que se encuentra en Internet es
https://blog.csdn.net/qq_40785363/article/details/79527343

Pero la segunda interfaz es la plantilla de interfaz de diálogo. Si crea una plantilla de widget, d.exec (); informará un error porque: la función exec () es una función de diálogo

Entonces, ¿cómo implementar la interfaz de tipo Widget?

Después de buscar mucho, finalmente me referí a https://wangbaiyuan.cn/qt-multi-window-switches.html y obtuve la solución

Código principal de muestra de inicio de sesión

Tome el interruptor de inicio de sesión para iniciar sesión como ejemplo (práctica):
login.h (ventana principal)

#include <QWidget>
#include "loginloading.h"

....

private slots:
    void on_login_clicked();

private:
    Ui::Login *ui;
    LoginLoading ll;
};

loginloading.h (ventana secundaria)

#include <QWidget>
private slots:
    void on_close_clicked();

main.cpp

#include "login.h"
    Login l;
    l.show();

login.cpp

#include "login.h"
#include "ui_login.h"
void Login::on_login_clicked()
{
    
    
    this->hide();
    ll.show();
    this->close();
}

loginloading.cpp

#include "loginloading.h"
#include "ui_loginloading.h"
void LoginLoading::on_close_clicked()
{
    
    
    this->close();
}

2. Visualización de llamadas mutuas de múltiples interfaces

El método anterior es en realidad un poco complicado. Solo es adecuado para un caso en el que una interfaz de clase base (interfaz principal) llama a una interfaz de clase derivada (interfaz secundaria). Cuando varias interfaces se llaman y se muestran entre sí, debe usar la función de ranura única de Qt y señal.

Cómo entender señales y ranuras

Por ejemplo, si loginid quiere saltar a la interfaz de inicio de sesión, loginid necesita enviar la señal show_login (), luego definir la función de ranura recibir_loginid_login () correspondiente a la solicitud de inicio de sesión enviada por loginid en la interfaz de inicio de sesión, y finalmente llamar a show_login (en la función de ranura del botón de inicio de sesión correspondiente ) Para mostrar la interfaz de inicio de sesión. Para una implementación específica, consulte el siguiente código ~

efecto

Las interfaces que se muestran sucesivamente son loginid, login, loginloading
Inserte la descripción de la imagen aquí

Estructura de ingeniería

Encabezados: login.h, loginid.h, loginloading.h
Fuentes: login.cpp, loginid.cpp, loginloading.cpp
Formas: login.ui, loginid.ui, loginloading.ui

Inicie sesión para cambiar el código completo

loginid.h

#ifndef LOGINID_H
#define LOGINID_H

#include <QWidget>

namespace Ui {
    
    
class LoginId;
}

class LoginId : public QWidget
{
    
    
    Q_OBJECT

public:
    explicit LoginId(QWidget *parent = nullptr);
    ~LoginId();

protected:
    void mouseMoveEvent(QMouseEvent *e);//鼠标移动
    void mousePressEvent(QMouseEvent *e);//鼠标按下移动

private slots:
    void on_close_clicked();

    void on_minimized_clicked();

    void on_login_clicked();

    void receive_back();

signals:
    void show_login();

private:
    Ui::LoginId *ui;
    QPoint p;
};

#endif // LOGINID_H

login.h

#ifndef LOGIN_H
#define LOGIN_H
#include <QWidget>
#include "loginloading.h"
QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Login; }
QT_END_NAMESPACE

class Login : public QWidget
{
    
    
    Q_OBJECT

public:
    Login(QWidget *parent = nullptr);
    ~Login();

protected:

    void mouseMoveEvent(QMouseEvent *e);//鼠标移动
    void mousePressEvent(QMouseEvent *e);//鼠标按下移动

private slots:
    void on_close_clicked();

    void on_minimized_clicked();

    void on_login_clicked();

    void on_back_clicked();

    void receive_loginid_login();

signals:
    void show_loginloading();

    void show_loginid();
private:
    Ui::Login *ui;

    QPoint p;

};
#endif // Login_H

loginloading.h

#ifndef LOGINLOADING_H
#define LOGINLOADING_H

#include <QWidget>

namespace Ui {
    
    
class LoginLoading;
}

class LoginLoading : public QWidget
{
    
    
    Q_OBJECT

public:
    explicit LoginLoading(QWidget *parent = nullptr);
    ~LoginLoading();

protected:

    void mouseMoveEvent(QMouseEvent *e);//鼠标移动
    void mousePressEvent(QMouseEvent *e);//鼠标按下移动

private slots:
    void on_pushButton_clicked();

    void receive_login_login();

private:
    Ui::LoginLoading *ui;

    QPoint p;
};

#endif // LOGINLOADING_H

main.cpp`

#include "login.h"
#include <QApplication>
#include "loginid.h"
#include "loginloading.h"

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    LoginId li;
    Login l;
    MainWindow w;
    LoginLoading ll;
    li.show();

    QObject::connect(&li,SIGNAL(show_login()),&l,SLOT(receive_loginid_login()));
    QObject::connect(&l,SIGNAL(show_loginid()),&li,SLOT(receive_back()));
    QObject::connect(&l,SIGNAL(show_loginloading()),&ll,SLOT(receive_login_login()));

//    w.checkLicense();

    return a.exec();

}
loginid.cpp

#include "loginid.h"
#include "ui_loginid.h"
#include <QMouseEvent>

LoginId::LoginId(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LoginId)
{
    
    
    ui->setupUi(this);

    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明;
        setAttribute(Qt::WA_TranslucentBackground);
}

LoginId::~LoginId()
{
    
    
    delete ui;
}


void LoginId::mousePressEvent(QMouseEvent *e)
{
    
    
    if(e->button() == Qt::LeftButton)
    {
    
    
        //求坐标差值
        //当前点击坐标-窗口左上角坐标
        p = e->globalPos() - this->frameGeometry().topLeft();
    }
}

void LoginId::mouseMoveEvent(QMouseEvent *e)
{
    
    
    if(e->buttons() & Qt::LeftButton)
    {
    
    
        //移到左上角
        move(e->globalPos() - p);
    }

}

void LoginId::on_close_clicked()
{
    
    
    close();
}
void LoginId::on_minimized_clicked()
{
    
    
    showMinimized();
}

void LoginId::on_login_clicked()
{
    
    
    this->hide();
    emit show_login();
}


void LoginId::receive_back()
{
    
    
    this->show();
}


login.cpp

#include "login.h"
#include "ui_login.h"
#include <QMouseEvent>
#include <QMessageBox>
#include <QDebug>

Login::Login(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Login)
{
    
    
    ui->setupUi(this);

    //去窗口边框
        setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明;
        setAttribute(Qt::WA_TranslucentBackground);

}

Login::~Login()
{
    
    
    delete ui;
}


void Login::mousePressEvent(QMouseEvent *e)
{
    
    
//    if(e->button() == Qt::RightButton)
//    {
    
    
//        //如果是右键
//        close();
//    }
    if(e->button() == Qt::LeftButton)
    {
    
    
        //求坐标差值
        //当前点击坐标-窗口左上角坐标
        p = e->globalPos() - this->frameGeometry().topLeft();

    }
}

void Login::mouseMoveEvent(QMouseEvent *e)
{
    
    
    if(e->buttons() & Qt::LeftButton)
    {
    
    
        //移到左上角
        move(e->globalPos() - p);
    }

}

void Login::on_close_clicked()
{
    
    
    close();
}
void Login::on_minimized_clicked()
{
    
    
    showMinimized();
}


void Login::on_login_clicked()
{
    
    
//    int i = ui->lineEdit->cursorPosition();
//    i+=10;
//    qDebug() << i;
//    ui->lineEdit->setCursorPosition(i);
//    ui->lineEdit_2->setCursorPosition(i);
//    ui->lineEdit->setFocus();
//    ui->lineEdit_2->setFocus();
    ui->lineEdit->setAlignment(Qt::AlignJustify);
    if(ui->lineEdit->text().trimmed() == tr("admin") && ui->lineEdit_2->text() == tr("admin"))
        {
    
    
            this->hide();
            emit show_loginloading();
        }
        else
        {
    
    
           QMessageBox mess(QMessageBox::Information,tr("Warning!"),tr("Wrong user name or password!"));
           mess.setWindowIcon(QIcon(":/main/logo"));
           mess.exec();

        // 清空输入框内容
           ui->lineEdit->clear();
           ui->lineEdit_2->clear();
           //光标定位
           ui->lineEdit->setFocus();
        }
}

void Login::on_back_clicked()
{
    
    
    this->hide();
    emit show_loginid();

}


void Login::receive_loginid_login()
{
    
    
    this->show();
}


loginloading.cpp

#include "loginloading.h"
#include "ui_loginloading.h"
#include <QMouseEvent>

LoginLoading::LoginLoading(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::LoginLoading)
{
    
    
    ui->setupUi(this);

    //去窗口边框
        setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    //把窗口背景设置为透明;
        setAttribute(Qt::WA_TranslucentBackground);



}

LoginLoading::~LoginLoading()
{
    
    
    delete ui;
}


void LoginLoading::mousePressEvent(QMouseEvent *e)
{
    
    
    if(e->button() == Qt::LeftButton)
    {
    
    
        //求坐标差值
        //当前点击坐标-窗口左上角坐标
        p = e->globalPos() - this->frameGeometry().topLeft();
    }
}

void LoginLoading::mouseMoveEvent(QMouseEvent *e)
{
    
    
    if(e->buttons() & Qt::LeftButton)
    {
    
    
        //移到左上角
        move(e->globalPos() - p);
    }

}

void LoginLoading::on_pushButton_clicked()
{
    
    
    this->close();
}

void LoginLoading::receive_login_login()
{
    
    
    this->show();
}

Referencia:
https://jingyan.baidu.com/article/020278114309b51bcc9ce5af.html
https://blog.csdn.net/qq_40785363/article/details/79527343
https://wangbaiyuan.cn/qt-multi-window-switches. html

Supongo que te gusta

Origin blog.csdn.net/qq_16488989/article/details/108976045
Recomendado
Clasificación