您尚未登录。

楼主 #1 2020-04-09 10:19:05

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

请教,static_cast<void (QComboBox::*)(int)>这是转换为什么类型?

在看一个qt5的代码,看到了信号是这么链接的:
connect(m_combo_flowControl, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=]() { emit settingChanged(Settings::FlowControl, m_combo_flowControl->currentData()); });

不懂为什么这里要加static_cast类型转换,转换为void型还是int型?

离线

#2 2020-04-09 10:45:30

metro
会员
注册时间: 2019-03-09
已发帖子: 445
积分: 489

Re: 请教,static_cast<void (QComboBox::*)(int)>这是转换为什么类型?

static_cast是C++风格的强制类型转换,相比C多了个指针类型的编译期检查,运行期应该没有区别。见What is the difference between static_cast<> and C style casting?
至于目标类型,是在QComboBox类内的函数的指针类型。由于类内非静态函数隐式传递了this指针,因此不能直接使用函数本身的类型(此时应当对应void (*)(int)),而是要加上类限定符。实际指向的函数应该具有void QComboBox::xxx(int)的形式。

离线

楼主 #3 2020-04-09 11:10:46

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 请教,static_cast<void (QComboBox::*)(int)>这是转换为什么类型?

谢谢,明白了。
QComboBox的currentIndexChanged函数有两个重载函数,所以用了强制类型转换,转换为带int参数的函数指针。

离线

#4 2020-04-09 11:42:31

cgpsky
会员
注册时间: 2017-09-07
已发帖子: 27
积分: 27

Re: 请教,static_cast<void (QComboBox::*)(int)>这是转换为什么类型?

1. 如果有重载。 建议用 SIGNAL 和 SLOT 来连接
2. 如果非要做转化。 建议用 QT 那一套。object_cast

离线

#5 2020-04-09 11:47:02

cgpsky
会员
注册时间: 2017-09-07
已发帖子: 27
积分: 27

Re: 请教,static_cast<void (QComboBox::*)(int)>这是转换为什么类型?

这种转化没有必要, 第三个参数 少了 this 吧。
connect(m_combo_flowControl, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [this =]() { emit settingChanged(Settings::FlowControl, m_combo_flowControl->currentData()); });
这种捕获。 lambda里 能访问到 m_combo_flowControl 这个嘛?

可以私聊

最近编辑记录 cgpsky (2020-04-09 12:00:05)

离线

楼主 #6 2020-04-09 12:35:40

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,378
积分: 1343.5

Re: 请教,static_cast<void (QComboBox::*)(int)>这是转换为什么类型?

谢谢。
第三个参数可以省掉吧。
SIGNAL SLOT是qt4的用法吧。
这是gitlab上下载的别人的代码。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn