zoukankan      html  css  js  c++  java
  • 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();
    
    }
  • 相关阅读:
    hdu 1045 Fire Net
    hdu 1044 Collect More Jewels
    hdu 1043 Eight
    hdu 1042 N!
    hdu 1041 Computer Transformation
    hdu 1040 As Easy As A+B
    CI在ngnix的配置
    angularjs表单验证checkbox
    chrome浏览器跨域设置
    angularjs向后台传参,后台收不到数据
  • 原文地址:https://www.cnblogs.com/victorywr/p/12284501.html
Copyright © 2011-2022 走看看