我有很多信号都具有相同的参数但执行不同的功能.
所有信号的连接和断开代码都是相同的,信号连接的插槽处理程序也是如此.
而不是一遍又一遍地编写这段代码.我想使用函数指针或类似的东西来分配信号,然后有一个公共代码块来执行连接或断开连接.
以下代码仅用于说明我所描述的内容,它无效且无法编译.
void (*pfnSignal)(quint8, QString);
switch( eSigID ) {
case SIGNAL_A:
pfnSignal = signalA;
break;
case SIGNAL_B:
pfnSignal = signalB;
break;
default:
pfnSignal = NULL;
}
if ( pfnSignal != NULL ) {
QObject::connect(pobjRef, pfnSignal, this, SLOT(handler(quint8, QString)));
}
Run Code Online (Sandbox Code Playgroud)
在Qt5中,这可以很容易地完成,因为它允许使用指向成员函数语法的新指针进行连接.
// Using decltype to avoid figuring out the ugly pointer-to-member-function syntax.
// Assumes all signals have the same arguments.
decltype<&ThatClass::someSignal> pfnSignal = nullptr;
switch( eSigID ) {
case SIGNAL_A:
pfnSignal = &ThatClass::signalA;
break;
case SIGNAL_B:
pfnSignal = &ThatClass::signalB;
break;
}
if (pfnSignal) {
connect(pobjRef, pfnSignal, this, &ThisClass::handler);
}
Run Code Online (Sandbox Code Playgroud)
但实际上,Qt4甚至可以实现这一点,因为SIGNAL宏是类型的const char*.
const char *pfnSignal = nullptr;
switch( eSigID ) {
case SIGNAL_A:
pfnSignal = SIGNAL(signalA(quint8, QString));
break;
case SIGNAL_B:
pfnSignal = SIGNAL(signalB(quint8, QString));
break;
}
if (pfnSignal) {
QObject::connect(pobjRef, pfnSignal, this, SLOT(handler(quint8, QString)));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3202 次 |
| 最近记录: |