实现效果如下:
第一个窗体显示一张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
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();
}