在看一个qt5的代码,看到了信号是这么链接的:
connect(m_combo_flowControl, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=]() { emit settingChanged(Settings::FlowControl, m_combo_flowControl->currentData()); });
不懂为什么这里要加static_cast类型转换,转换为void型还是int型?
离线
static_cast是C++风格的强制类型转换,相比C多了个指针类型的编译期检查,运行期应该没有区别。见What is the difference between static_cast<> and C style casting?
至于目标类型,是在QComboBox类内的函数的指针类型。由于类内非静态函数隐式传递了this指针,因此不能直接使用函数本身的类型(此时应当对应void (*)(int)),而是要加上类限定符。实际指向的函数应该具有void QComboBox::xxx(int)的形式。
离线
谢谢,明白了。
QComboBox的currentIndexChanged函数有两个重载函数,所以用了强制类型转换,转换为带int参数的函数指针。
离线
1. 如果有重载。 建议用 SIGNAL 和 SLOT 来连接
2. 如果非要做转化。 建议用 QT 那一套。object_cast
离线
这种转化没有必要, 第三个参数 少了 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)
离线
谢谢。
第三个参数可以省掉吧。
SIGNAL SLOT是qt4的用法吧。
这是gitlab上下载的别人的代码。
离线