一次性解决Qt Widget类型Ui界面切换问题(最简单)

本文非常适合我这种小白学习,请君仔细查看。
12月9日,回看两个月前写的此篇博客,第一种方法是父界面调用子界面,第二种方法多个界面之间没有继承关系。

一、Qt Widget类型Ui界面之父界面调用子界面

网上搜到的一种比较常见的解决方案是
https://blog.csdn.net/qq_40785363/article/details/79527343

但是第二个界面是Dialog界面模版,如果创建的是 Widget模版,d.exec();这句话就会报错,因为:exec()函数是Dialog的函数

那么对于Widget类型的界面怎么实现呢?

苦苦搜索了一番,最后参考了https://wangbaiyuan.cn/qt-multi-window-switches.html,得到了解决

登录示例核心代码

以登录切换到登录中作为例子(已实践):
login.h(父窗口)

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

....

private slots:
    void on_login_clicked();

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

loginloading.h(子窗口)

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

二、多个界面相互调用显示

上面的方法实际上有点讨巧,只适用于一个基类界面(父界面)调用一个派生类界面(子界面)的情况,当多个界面之间相互调用显示时,需要采用Qt特有的槽函数与信号。

如何理解信号与槽

比如loginid要跳转到login界面,就需要loginid发送show_login()信号,然后在login界面中定义loginid发送的登录请求对应的槽函数receive_loginid_login(),最后在对应的login按钮的槽函数中调用show_login()即可显示login界面了。具体实现参看下面的代码~

效果

先后展示的界面是loginid,login,loginloading
在这里插入图片描述

工程结构

Headers:login.h,loginid.h,loginloading.h
Sources:login.cpp,loginid.cpp,loginloading.cpp
Forms:login.ui,loginid.ui,loginloading.ui

登录切换完整代码

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

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

  • 7
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Qt一个跨平台的C++应用程序开发框架,可以用于快速、高效地开发GUI界面。在Qt中,可以通过多种方式实现多个UI界面切换。 一种常用的方式是使用QStackedWidget控件。QStackedWidget一个堆叠窗口容器,可以在其中放置多个UI界面,通过setCurrentIndex函数可以切换不同的界面。首先,需要在Qt Designer中设计好每个UI界面,然后在代码中创建对应的窗口对象,并将其添加到QStackedWidget控件中。当需要切换到另一个界面时,可以调用setCurrentIndex函数设置当前界面的索引值,从而实现界面切换。 另一种方式是使用QTabWidget控件。QTabWidget一个选项卡窗口容器,可以通过选项卡来切换不同的UI界面。类似于QStackedWidget,首先需要在Qt Designer中设计好每个UI界面,并在代码中创建对应的窗口对象。然后,将这些窗口对象添加到QTabWidget控件中,并设置对应的选项卡标题。通过切换选项卡,即可实现不同界面切换。 此外,还可以使用QMainWindow作为主窗口,通过在其中添加不同的子窗口对象来实现界面切换。在需要切换界面时,可以使用setCentralWidget函数设置中心窗口部件,来替换当前显示的子窗口界面。 总之,Qt提供了多种方式来实现多个UI界面切换,开发者可以根据具体需求选择合适的方法来实现界面的动态切换。通过这些方法,可以方便地实现复杂的界面逻辑和用户交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂java杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值