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();

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM