Qt/C++ 基于比较的信号调度的优雅方式

Qt/C++ Elegant way for comparison based signal dispatching

我正在做一个项目,我通过 UDP 接收消息,并根据该消息发出不同的信号,所有信号都具有相同的参数。

结构是这样的:

if(command_type == COMMAND_TYPE_MOVE)
{
    emit sigMoveForward(data);
}
else if(command_type == COMMAND_TYPE_STOP)
{
    emit sigStopMove(data);
}

当超过 10 个命令时,编程和维护会变得非常乏味。有没有办法做得更好?

我想创建一个 QMap 并对其进行查找并发出我收到的信号。在 Qt 中是否可以有一个指向函数的指针并以这种方式省略它?

如果所有信号都包含相同的 data,您可以发送一个包含 2 个参数(command_type + data)的唯一信号,然后检查 command_type在接收槽

//...
emit sigCommand(command_type, data)
//...

void MyClass::commandReceived(CommandType command_type, QVariant data) {
    if(command_type == COMMAND_TYPE_MOVE)
    {
        moveForward(data);
    }
    else if(command_type == COMMAND_TYPE_STOP)
    {
        stopMove(data);
    }
    //...
}

没有区别
emit sigMoveForward(data);

sigMoveForward(data);

因此,如果命令是连续的,您可以创建带有指向信号或更好的普通数组的指针的 QMap。不过,它的语法相当棘手。

void (Your_class::*signals[COMMAND_COUNT])(your_data_type) ;
...
signals[COMMAND_TYPE_MOVE] = &Your_class::moveForward;
signals[COMMAND_TYPE_STOP] = &Your_class::stopMove;
....

然后像那样发出:

(this->*signals[command_type])(data);