如何新建一个窗口
为了区分主窗口和子窗口,我们把主窗口的标题改为"老大",子窗口的标题改为"小弟"。
在"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);
测试程序,运行正常。