自定义信号
除了使用Qt框架提供的信号外,我们还可以自己定义信号以及槽函数。自定义信号和槽函数使得程序设计更加灵活。与槽函数一样,使用信号跟使用普通函数类似,只不过需要使用关键字signals
声明且函数的返回值类型必须是void。如下:
signals: void mySignal(int value);
值得注意的是,在类中自定义一个信号时==,实际上只是声明了一个函数原型==。信号本身并不需要“我们”自己来具体实现,而是由Qt依据元对象编程技术自动生成。所以我们只需要告诉Qt这个函数是一个信号就可以了。
发射信号
信号通过emit关键字来发射,实际上emit只是一个宏,并没有实际操作,仅仅用于标识。
emit mySignal(42);
上述代码就发射了mySignal信号,并携带了一个整型参数。当信号被发射时,Qt的元对象系统会找到该信号连接的所有槽函数,并依次调用它们。
自定义槽
槽函数可以是任何的普通函数,只需要在声明的过程中使用slots
关键字。事实上,新的Qt版本出来之后可以不使用slots
关键字(为了便于区分,推荐使用)。此外,槽函数可以搭配访问限定符使用。
比如:
通过函数名自动连接槽
事实上,除了使用slots
关键字定义槽函数,我们也能通过使用设计模式给控件添加槽函数,并自动生成槽函数的声明。操作如下:
- 打开设计者模式,选择一个控件,鼠标右键单机该控件,选择转入槽
- 选择一个事件绑定槽函数
- 自动生成槽函数的声明,定义则需要自己实现
值得注意的的是,通过这种方式生成的槽函数自动连接上了信号!该信号就是之前我们选择的事件。
案例
实验要求:自定义一个信号和槽并进行连接,该槽函数响应信号的行为为修改窗口标题。这个自定义信号的发送是通过点击一个按钮来触发的。
- 自定义一个
mysignal
信号和槽myhandler
2.连接mysignal
信号和槽myhandler
- 用设计者模式生成一个按钮控件,并为这个按钮的点击事件连接一个槽函数。该槽函数的行为是发送信号
mysignal
4.构建窗口,点击按钮并观察结果
这个简单的案例将我们上述内容都结合在了一起。