Bootstrap

Qt -两个独立的窗口

如何新建一个窗口

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
为了区分主窗口和子窗口,我们把主窗口的标题改为"老大",子窗口的标题改为"小弟"。
在"mainwidget.cpp"中,

setWindowTitle("老大");//与 this->setWindowTitle("老大"); 的写法等价

在"subwidget.cpp"中,

this->setWindowTitle("小弟");

在子窗口新建一个按键b
首先在"subwidget.h"中声明一下

private:
    QPushButton b;

然后在"subwidget.cpp"中

b.setParent(this);//指定当前窗口为父对象
b.setText("切换到主窗口");

在主窗口再新建一个按键b3
首先在"mainwidget.h"中声明一下

QPushButton b3;

然后在"mainwidget.cpp"中

b3.setParent(this);//指定当前窗口为父对象
b3.setText("切换到子窗口");
b3.move(50,50);

因为子窗口也是一种控件,要想让子窗口显示出来,也需要定义一个子窗口对象。
首先在"mainwidget.h"中声明一下

SubWidget subw;

mainwidget和subwidget这两个窗口是独立的。
所以不需要指定主窗口为子窗口的父对象。
然后让子窗口显示
在"mainwidget.cpp"中

//显示子窗口
subw.show();

运行一下,会出现两个窗口。
在这里插入图片描述
下面,我们来实现功能:
当按下主窗口中的按钮之后,切换到子窗口,同时主窗口隐藏。
当按下子窗口中的按钮之后,切换到主窗口,同时子窗口隐藏。

先不让子窗口显示,

//subw.show();

然后还需要用到connect函数。
由于我们既让它切换到一个窗口,同时让另外一个窗口隐藏,因此需要自定义槽函数。

这里有一个快捷键,使用F4,可在相对应的头文件和源文件之间互相跳转。

主窗口切换到子窗口并隐藏

到"mainwidget.cpp"中

//处理子窗口发送过来的信号。
connect(&subw,&SubWidget::mySignal,this,&MainWidget::changeSubWindow);

需要声明并实现一个槽函数changeWindow()

void MainWidget::changeWindow()
{
    //子窗口显示,主窗口隐藏
    subw.show();
    this->hide();
}

需要注意,定义并使用函数,必须要在相应的.h文件中进行声明
因此,需要在"mainwidget.h"中对changeWindow()进行声明。

    void changeWindow();

子窗口切换到主窗口并隐藏

现在出现一个问题:
因为mainwidget.h中有子窗口的对象,所以主窗口可以想让子窗口显示就显示,隐藏就隐藏,而子窗口却不能这么做。那子窗口怎么才能让主窗口的对象显示和隐藏呢?

由子窗口来发送一个信号,父窗口来接收这个信号,然后对这个信号进行处理就可以了。

那么怎样自定义信号和使用信号呢?
到"subwidget.h"中

signals:
    /* 信号必须有signals关键字来声明
     * 信号没有返回值,但可以有参数
     * 信号就是函数的声明,只需声明,无需定义
     * 使用时:emit mySignal();
    */
    void mySignal();

这样以后,信号就定义完成了。
接下来,就让子窗口中的按键按下以后,信号就发送出去
到"subwidget.cpp"中

connect(&b,&QPushButton::clicked,this,&SubWidget::sendSlot);

因此,还需要声明并实现一个槽函数sendSlot(),然后在槽函数中发送信号
到"subwidget.h"中

    void sendSlot();

到"subwidget.cpp"中

void SubWidget::sendSlot()
{
     emit mySignal();
}

处理子窗口发送过来的信号。
到"mainwidget.cpp"中

   //处理子窗口发送过来的信号。
connect(&subw,&SubWidget::mySignal,this,&MainWidget::changeSubWindow);

因此需要声明并实现一个槽函数changeSubWindow()

void MainWidget::changeSubWindow()
{
    //主窗口显示,子窗口隐藏
    subw.hide();
    this->show();
}

需要注意,定义并使用函数,必须要在相应的.h文件中进行声明
因此,需要在"mainwidget.h"中对changeSubWindow()进行声明。

    void changeSubWindow();

注意点
connect函数的第一个参数要传递的是地址

测试程序后还会出现一个问题,就是在切换主窗口和子窗口的时候,主窗口和子窗口的大小会变,怎么解决呢?
分别对这两个窗口指定大小
在"mainwidget.cpp"和"Subwidget.cpp"中

this->resize(400,400);

测试程序,运行正常。

;