實現效果如下:
第一個窗體顯示一張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(); }