3–自定义信号
目录
1–给窗口添加button
2–信号槽的实现以及自定义槽函数
3.1 创建子窗口时隐藏MainWidget窗口
只需要在自定义槽函数 void MainWidget::createSubWindows()中添加this->hide();
void MainWidget::createSubWindows()
{
this->hide();
sub_windows.show();
}
此时,当我们在MainWidget窗口点击create the subWindows按钮时,subWindows被创建的同时MainWidget窗口会被隐藏。如图所示。
3.2 再次显示MainWideget窗口
假设现在的需求是点击subWindows窗口中的subButton,显示MainWidget窗口并隐藏subWindows窗口,该如何实现?
显而易见的是,要相应点击事件,需要让button发出信号,通过一个槽函数来接收信号。
此时就会存在一个问题,在subWindows窗口中,无法控制MainWidget窗口的显示或者隐藏(因为subWindows是MainWidget类的一个对象)。所以,我们只能通过MainWidget对象自身来控制MainWidget窗口的显示和隐藏,且由于subWindows是MainWidget的一个成员对象,所以MainWidget可以接收subWindows发出的信号。
所以,具体实现方法是:
通过点击subButton,让subWindows发出一个信号,同时MainWidget接收subWindows发出的信号来控制MainWidget的显示。
显然,这里需要两个connect,一个连接subButton与subWindows,一个连接subWindows与MainWidget。且QT5本身没有提供我们当前需要从subWindows发出的信号,所以需要自定义一个信号sigSubShowMain(),该信号通过subButton与subWindows的connect中槽函数发射出来,充当subWindows与MainWidget的connect中的信号,并让其槽函数响应。
具体步骤如下:
1)在SubW.h中声明自定义信号sigSubShowMain()和自定义槽函数slotShowMain()
//SubW.h
class SubW : public QWidget
{
...
signals:
//自定义信号
//1、可以有参数
//2、可以重载
//3、返回值为void
void sigSubShowMain();
public slots:
void slotShowMain();
...
};
2)在SubW.cpp connect信号与槽,并定义自定义槽函数slotShowMain()
SubW::SubW(QWidget *parent) : QWidget(parent)
{
...
connect(&sub_button,&QPushButton::clicked,this,&SubW::slotShowMain;
}
void SubW::slotShowMain()
{
//发送信号 emit + sig();
emit sigSubShowMain();
}
3) 在MainWidget.h中声明自定义槽函数,slotShowMyself()
#MainWidget.h
class MainWidget : public QWidget
{
...
public slots:
void slotShowMyself();
};
4)在MainWidget.cpp中连接信号与槽,并定义slotShowMyself()
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
...
connect(&sub_windows,&SubW::sigSubShowMain,this,&MainWidget::slotShowMyself);
}
void MainWidget::slotShowMyself()
{
//显示MainWidget并隐藏sub_windows
this->show();
sub_windows.hide();
}
至此,我们就实现了主窗口点击显示子窗口,子窗口点击显示主窗口。