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);
我正在做一个项目,我通过 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);