Qt多窗口切换
-
ui布局
新建一个窗体oneform,布局ui界面并添加跳转按钮PushButton
-
手动按钮绑定
由于要跳转到第二个页面,因此最好在一开始就建好第二个页面,具体方法如下:
在该工程文件夹的目录下右击->添加新文件->Qt->Qt设计师界面类->Widget(其他默认就可)->下一步->将类名改为twoform(存储文件夹千万不要改,改了就不再一个工程目录下边了)->下一步->确认
第二个页面同样随意布局就行
- 在头文件oneform.h中添加初始化函数;
private:
Ui::oneform *ui;
void Init();
//定义一个指针全局对象
twoform *p_t2;
并添加跳转到第二个页面的槽
private slots:
void doProcessToTwoPage(bool);
- 在oneform.cpp中实现初始化函数并绑定按钮
void oneform::Init()
{
//在labe中添加gif图片,并在触发的时候播放
QMovie *movie=new QMovie("../CanvasTransfer/01.gif");
ui->label_movie->setMovie(movie);
movie->start();
ui->label_movie->setScaledContents(true);
//绑定:第一个页面的按钮,点击跳转到第二个页面
connect(ui->btnToTwoForm,SIGNAL(clicked(bool)),this,SLOT(doProcessToTwoPage(bool)));
//为全局指针对象初始化
p_t2=new twoform();
}
-
对绑定的槽实现槽处理
显示第二个页面,隐藏当前(第一个)页面
/SLOT//
void oneform::doProcessToTwoPage(bool)
{
//创建第二个页面
//若为局部变量,则点击一次创建一个对象,浪费内存
//twoform *tf1=new twoform(); tf1->show();
//如果有this指针,则新建的窗体会在当前窗体中直接显示(子窗体在父窗体中显示)
//twoform *tf1=new twoform(this);
//第二种,使用全局变量的方式,创建一个类对象,在使用的时候让其显示,且不会出现第一种点击一次创建一个对象
//tf1.show();
//this->hide();
//第三种 指针型的全局变量
p_t2->show();
this->hide();
}
注意:一定要记得在构造函数里边调用初始函数,否则在程序启动调用构造函数时候不会调用编写的函数,想要实现的功能就不会显示了
-
第二个页面返回到第一个页面
布局的第二个页面有返回到第一个页面的按钮,点击按钮,返回到第一个页面
同样的,在twoform.h中添加初始化函数;
private:
Ui::twoform *ui;
int ClickCount;
void Init();
添加按钮处理槽
private slots:
void doProcessToOnePage(bool);
添加一个发送信号
signals:
void SignalShowOneFore(QString);
在twoform.cpp中实现初始化函数并绑定按钮
void twoform::Init()
{
ClickCount=0;
QMovie *movie=new QMovie("../CanvasTransfer/02.gif");
ui->label_movie2->setMovie(movie);
movie->start();
ui->label_movie2->setScaledContents(true);
//为返回按钮绑定槽
connect(ui->btn_Return,SIGNAL(clicked(bool)),this,SLOT(doProcessToOnePage(bool)));
}
实现槽处理函数
void twoform::doProcessToOnePage(bool)
{
ClickCount++;
//发送给第一个窗体信号,通知其显示
emit SignalShowOneFore(QString::number(ClickCount));
}
既然第二个页面已经发出来信号,那么第一个页面也要进行处理该信号,因此回到oneform.h中,添加槽
private slots:
void doProcessToTwoPage(bool);
//接收第二个页面发来的信号并进行绑定槽处理
void doProcessTowFormRequest(QString);
在oneform.cpp中的Init()函数中添加代码,将按钮绑定槽
//绑定:接受第二个页面发来的信号
connect(p_t2,SIGNAL(SignalShowOneFore(QString)),this,SLOT(doProcessTowFormRequest(QString)));
实现接收第二个页面发来的信号槽函数
void oneform::doProcessTowFormRequest(QString str)
{
//因为该方法绑定的发送者是第二个页面的对象p_t2,因此接收到的信息即为第二个界面emit发送的信号
qDebug()<<str<<endl;
//现在是在oneform中,因此this指的是第一个界面,显示第一个页面,隐藏第二个页面
this->show();
p_t2->hide();
}
至此,两个页面之间的相互跳转即实现。
同样的,按照上述步骤循环即可实现多个页面之间的相互跳转。
补充全局变量的3种方式
为全局指针对象初始化需要注意,不要添加参数this,添加了this就相当于在当前父级页面下直接创建第二个页面的对象,并将其显示到第一个页面中。
有3种创建第二个页面的方式
第1种:
//若为局部变量,则点击一次创建一个对象,浪费内存
twoform *tf1=new twoform();
tf1->show();
//如果有this指针,则新建的窗体会在当前窗体中直接显示(子窗体在父窗体中显示)
twoform *tf1=new twoform(this);
//第2种,使用普通全局变量的方式,创建一个类对象,在使用的时候让其显示,且不会出现第一种点击一次创建一个对象
在oneform.h中添加twoform的头文件并添加全局对象twoform tf1;
//回到oneform.cpp
tf1.show();
//this->hide();
//第三种 指针型的全局变量(当前正在使用的)
//在oneform.h中添加指针型全局对象twoform *p_t2;
//回到oneform.cpp
p_t2->show();
this->hide();