关于connect函数参数的一些思考

今天在看示例代码的时候,发现了这么一条语句:

    connect(m_themeComboBox,
            static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
            this, &ThemeWidget::updateUI);

其实就是很常见的connect语句,这种连接方式我以前也用过,不过绝大多数情况下我用的是SIGNAL()SLOT(),因此对于这种方式的使用经验不够。

比较头痛的地方在于,为什么在信号之前加上了这么一大块的东西。
可以将它细分为两块:

  1. 类型强转
  2. void (QCombobox:: *)(int)

接下来一块一块分析。

看到这个语句的时候,我第一反应是void (QComboBox:: *)(int)这是个什么玩意。
后来静下心来想了想,这玩意就是一个函数指针啊。简化一下,可以将之变为void (*)(int),这样是不是就很清晰了,这是一个函数指针,然后前面的QCOmboBox::表明是类的作用域,因此,将它们整合在一起之后,就是一个类函数指针

好的,第一个问题解决了,接下来就是为什么要进行一个类型强转。
以下是QComboBox的currentIndexChanged信号的官方手册介绍:
在这里插入图片描述
可以看到,Qt对这个信号进行了重载,一个是带着int参数,一个是带着QString参数。
对于上述的这种connect连接方式而言,如果仅仅写成&QComboBox::currentIndexChanged,那么将无法确定具体采用的信号是哪一个。
鉴于此,采用类型强转的方式是为了唯一确定连接的信号类型

其实在得出这个结论之前,曾经有过是否是为了在连接建立之后过滤连接信号的想法,后来在追踪了源码的情况下,推翻了这个想法,因为在connect函数中,是将这个函数指针进行了备份(采用了指针的指针),如上述的转型,就确保了这个连接在建立的时候就确定了可接受的参数类型。

综上,得到如下结论:
这个类型强转起到了确定connect函数的信号和槽连接时候的类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值