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!
Tabla de contenido
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
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