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多个窗体切换显示的主要内容,如果未能解决你的问题,请参考以下文章