Bootstrap

Qt多窗口切换

Qt多窗口切换

  1. ui布局

    新建一个窗体oneform,布局ui界面并添加跳转按钮PushButton
    
  2. 手动按钮绑定

     由于要跳转到第二个页面,因此最好在一开始就建好第二个页面,具体方法如下:
    

在该工程文件夹的目录下右击->添加新文件->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();
}
  1. 对绑定的槽实现槽处理

    显示第二个页面,隐藏当前(第一个)页面
    
/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();
}

注意:一定要记得在构造函数里边调用初始函数,否则在程序启动调用构造函数时候不会调用编写的函数,想要实现的功能就不会显示了

  1. 第二个页面返回到第一个页面

     布局的第二个页面有返回到第一个页面的按钮,点击按钮,返回到第一个页面
    

同样的,在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();

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;