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

483 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

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

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

网上搜到的一种比较常见的解决方案是 blog.csdn.net/qq_40785363…

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

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

苦苦搜索了一番,最后参考了wangbaiyuan.cn/qt-multi-wi…

登录示例核心代码

以登录切换到登录中作为例子(已实践): 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();
}

参考: jingyan.baidu.com/article/020… blog.csdn.net/qq_40785363… wangbaiyuan.cn/qt-multi-wi…