QT多个窗体切换显示

Posted victorywr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT多个窗体切换显示相关的知识,希望对你有一定的参考价值。

实现效果如下:

第一个窗体显示一张gif动图,第二个窗体显示另一张动图,第三个窗体显示一个0-100的计数器

 

第一个界面的下方按钮可以点击跳转到第二个界面,第二个界面下方可以选择跳转到第一个或者到第三个界面,第三个界面下方有一个返回第二个界面的按钮

实现各个页面的跳转显示且每次只会显示一个界面

一、建立一个Qwidget工程,在ui里面添加一个按钮button和一个标签label;

 

 

二、右键项目名称,在弹出的选项中选择 “添加新文件” 

 

 

 

 三、选择QT->Qt设计师界面类,点击右下方choose;

 

 

 四、选择widget,点击右下方下一步;

 

 五、自己给这个窗体取一个名字,点击下一步(如此便创建成功第二个界面和它的头文件和源文件)

 

 

 六、重复上面2-5步建立第三个窗体文件,最后工程里面应该一共包括有以下文件

 

 我的工程里widget.ui是第一个界面,secondform是第二个界面,thirdform是第三个界面

七、在第二个、第三个界面中放入控件

第二个界面放入两个按钮pushbutton和一个标签label;第三个界面放入一个按钮pushbutton和一个LCDnumber。如下图所示:(按钮名字可以自己取)

                                 

 

 

 

八、 各个窗体头文件定义,所有槽函数定义对应于要实现的功能,对应于各个按钮按下后要实现的事件

在第一个Widget的头文件中定义一个处理跳转到第二个界面的槽函数doprocessclickgotosecondform(bool)和一个接收来自第二个界面发送请求信号的槽函数doprocesssecondformrequest(QString),代码如下所示:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"secondform.h"//包含第二个界面的头文件
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void doprocessclickgotosecondform(bool);
    void doprocesssecondformrequest(QString);  //处理第二个界面发送来的请求
private:
    Ui::Widget *ui;
    void Init();
    secondForm *sf1;
};

#endif // WIDGET_H

 

 在第二个窗体头文件里定义跳转到第一个和第三个窗体的槽函数doProcessClickBackToFirstForm(bool)、doProcessClickGoToThirdForm(bool),还有从第三个界面发送来的显示第二个界面的槽函数doProcessShowSecondForm();如下所示:

 #ifndef SECONDFORM_H
#define SECONDFORM_H

#include <QWidget>
#include"thirdform.h"
namespace Ui {
class secondForm;
}

class secondForm : public QWidget
{
    Q_OBJECT

public:
    explicit secondForm(QWidget *parent = 0);
    ~secondForm();

private slots:
    void doProcessClickBackToFirstForm(bool);
    void doProcessClickGoToThirdForm(bool);
    void doProcessShowSecondForm();

signals:
    void SignalShowFirstForm(QString);   //定义的发出到第一个界面的信号

private:
    Ui::secondForm *ui;
    void Init();
    int click_count;
    thirdForm *p_tr;
};

#endif // SECONDFORM_H

 

第三个窗体头文件中定义一个跳转到第二个界面的槽函数doprocessbacktosecondform()和一个定时器的超时槽函数doprocesstimeout()

#ifndef THIRDFORM_H
#define THIRDFORM_H

#include <QWidget>
#include"QTimer"

namespace Ui {
class thirdForm;
}

class thirdForm : public QWidget
{
    Q_OBJECT

public:
    explicit thirdForm(QWidget *parent = 0);
    ~thirdForm();

private slots:
    void doprocesstimeout();
    void doprocessbacktosecondform();

signals:
    void SignalshowsecondForm();

private:
    Ui::thirdForm *ui;
    int count;
    QTimer *mytimer;
    void Init();
};

#endif // THIRDFORM_H

 

九、对各个槽函数的实现,在各个窗体对应的源程序中进行实现,如下所示:对所有代码都有详细的注释和说明

第一个窗体

#include "widget.h"
#include "ui_widget.h"
#include"QMovie"
#include"QDebug"
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    Init();
}

Widget::~Widget()
{
    delete ui;
}
 void Widget::Init()
 {
     QMovie *movie=new QMovie("../chuangtiqiehuang/1.gif");
     movie->start();
     ui->label->setMovie(movie);
 ui->label->setScaledContents(true); //画面铺满整个标签
 connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(doprocessclickgotosecondform(bool)));       //去到第二个界面的信号与槽事件
 sf1 =new secondForm();
 connect(sf1,SIGNAL(SignalShowFirstForm(QString)),this,SLOT(doprocesssecondformrequest(QString)));  //发送者是第二个界面sf1对象 ,信号是SignalShowFirstForm(QString))
 }



 void Widget::doprocessclickgotosecondform(bool){
     //方式一:创建全局变量 第二个界面的对象,若tf1是局部变量,则不会显示第二个界面,因为调用完局部变量就被释放掉了
     sf1->show();//sf1是在第一个界面头文件里定义的全局变量

    //方式二:创建对象指针,指针则可以是局部的
    //secondForm *sf2=new secondForm();  //若改变形式为 secondForm *sf2=new secondForm(this) 子窗体将会在父窗体内显示
     //sf2->show();            //方式二没点击一次按钮信号就会产生一个二号界面,每触发一次槽事件就会给指针赋予一个新值

     this->hide();//隐藏当前的窗体
 }

 void Widget::doprocesssecondformrequest(QString str){

     qDebug()<<str<<endl;
     this->show();    //打印后显示当前(第一个窗体)界面

 }

第二个窗体

#include "secondform.h"
#include "ui_secondform.h"
#include"QMovie"
secondForm::secondForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::secondForm)
{
    ui->setupUi(this);
    Init();
}

secondForm::~secondForm()
{
    delete ui;
}
void secondForm::Init()
{
    click_count=0;
    QMovie *movie=new QMovie("../chuangtiqiehuang/2.gif");
    movie->start();
    ui->label->setMovie(movie);
ui->label->setScaledContents(true);
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(doProcessClickBackToFirstForm(bool)));

p_tr=new thirdForm();
connect(ui->pushButton_2,SIGNAL(clicked(bool)),this,SLOT(doProcessClickGoToThirdForm(bool)));

connect(p_tr,SIGNAL(SignalshowsecondForm()),this,SLOT(doProcessShowSecondForm()));  //第三个界面发来信号显示第二个界面
}

void secondForm::doProcessClickBackToFirstForm(bool){
    //发送信号,通知第一个窗体显示
    click_count++;
  emit SignalShowFirstForm(QString::number(click_count));  //发送信号,通知第一个窗体显示,定义一个发出信号
    this->hide();  //发送信号后隐藏当前(第二个窗体)界面
}

void secondForm::doProcessClickGoToThirdForm(bool)
 {
  p_tr->show();
this->hide();

}

void secondForm::doProcessShowSecondForm(){

    this->show();
}

第三个窗体

#include "thirdform.h"
#include "ui_thirdform.h"

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

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

void thirdForm::Init(){
    count=0;
    mytimer=new QTimer(this);
    connect(mytimer,SIGNAL(timeout()),this,SLOT(doprocesstimeout()));
    mytimer->start(100);//定时器每100ms触发一次超时事件

    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(doprocessbacktosecondform()));
}


void thirdForm::doprocesstimeout(){

    count++;
   if(count==100)
     count=0;
   ui->lcdNumber->display(count);

}

void thirdForm::doprocessbacktosecondform(){
    emit SignalshowsecondForm(); //发送到第二个界面的请求显示第二个界面的信号
    this->hide();

}

 

以上是关于QT多个窗体切换显示的主要内容,如果未能解决你的问题,请参考以下文章

QT多窗口切换的问题

C#窗口切换问题:如何切换回主窗体

在 matplotlib 内联和 QT 后端之间切换 Python 脚本

qt 窗体透明,控件不透明

QT 如何最小化窗体

片段中的ListView不显示