Qt是否可以定义一个函数指针来代替信号?

SPl*_*ten 2 c++ qt qt-signals

我有很多信号都具有相同的参数但执行不同的功能.

所有信号的连接和断开代码都是相同的,信号连接的插槽处理程序也是如此.

而不是一遍又一遍地编写这段代码.我想使用函数指针或类似的东西来分配信号,然后有一个公共代码块来执行连接或断开连接.

以下代码仅用于说明我所描述的内容,它无效且无法编译.

    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)

Tho*_*ire 6

在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)