QT中自定义信号槽的使用浅析+实例

1. Qt中自定义信号槽的使用

Qt框架提供的信号槽在某些特定场景下是无法满足我们的项目需求的,因此我们还设计自己需要的的信号和槽,使用connect()对自定义的信号槽进行连接。

如果想要使用自定义的信号槽, 首先要编写新的类并且让其继承Qt的某些标准类,我们自己编写的类想要在Qt中使用使用信号槽机制, 那么必须要满足的如下条件:

  • 这个类必须从QObject类或者是其子类进行派生
  • 在定义类的头文件中加入 Q_OBJECT 宏

1.1 自定义信号

要求:
1. 信号是类的成员函数
2. 返回值是 void 类型
3. 信号的名字可以根据实际情况进行指定
4. 参数可以随意指定, 信号也支持重载
5. 信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
6. 信号函数只需要声明, 不需要定义(没有函数体实现)
7. 在程序中发送自定义信号: 发送信号的本质就是调用信号函数

  • 习惯性在信号函数前加关键字: emit
  • emit只是显示的声明一下信号要被发送, 没有特殊含义
  • 底层 emit == #define emit

示例

class Test : public QObject
{
   
    Q_OBJECT
signals:
    void testsignal();
	// 参数的作用是数据传递, 谁调用信号函数谁就指定实参
	// 实参最终会被传递给槽函数
    void testsignal(int a);
};

1.2 自定义槽

槽函数就是信号的处理动作,自定义槽函数和自定义的普通函数写法是一样的。

要求:

  1. 返回值是 void 类型
  2. 槽也是函数, 因此也支持重载
  • 槽函数需要指定多少个参数, 需要看连接的信号的参数个数
  • 槽函数的参数是用来接收信号发送的数据的, 信号发送的数据就是信号的参数
  • 举例:
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a, double b);
  • 总结:
    槽函数的参数应该和对应的信号的参数个数, 类型一一对应
    信号的参数可以大于等于槽函数的参数个数 == 信号传递的数据被忽略了
    信号函数: void testsig(int a, double b);
    槽函数: void testslot(int a);
    这里槽函数只接受信号函数中的第一个参数
  1. Qt中槽函数的类型:
    - 类的成员函数
    - 全局函数
    - 静态函数
    - lambda表达式(匿名函数)
  2. 槽函数可以使用关键字进行声明: slots (Qt5中slots可以省略不写)
    - public slots:
    - private slots:
    - protected slots:
// 举例
// 类中的这三个函数都可以作为槽函数来使用
class Test : public QObject
{
   
public:
    void testSlot();
    static void testFunc
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值