当前位置:   article > 正文

一次性解决Qt Widget类型Ui界面切换问题(最简单)_qt两个ui界面,打开一个后,另一个界面不动

qt两个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;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

loginloading.h(子窗口)

#include <QWidget>
private slots:
    void on_close_clicked();
  • 1
  • 2
  • 3

main.cpp

#include "login.h"
    Login l;
    l.show();
  • 1
  • 2
  • 3

login.cpp

#include "login.h"
#include "ui_login.h"
void Login::on_login_clicked()
{
    this->hide();
    ll.show();
    this->close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

loginloading.cpp

#include "loginloading.h"
#include "ui_loginloading.h"
void LoginLoading::on_close_clicked()
{
    this->close();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

上面的方法实际上有点讨巧,只适用于一个基类界面(父界面)调用一个派生类界面(子界面)的情况,当多个界面之间相互调用显示时,需要采用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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

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();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/118109
推荐阅读
相关标签
  

闽ICP备14008679号