其他分享
首页 > 其他分享> > 关于connect函数参数的一些思考

关于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函数的信号和槽连接时候的类型。

标签:强转,int,QComboBox,函数参数,connect,思考,函数指针,连接
来源: https://blog.csdn.net/weixin_43450564/article/details/112390809