Qt / C ++ Элегантный способ диспетчеризации сигналов на основе сравнения - PullRequest
2 голосов
/ 14 мая 2019

Я работаю над проектом, в котором я получаю сообщение через UDP, и на основании этого сообщения я излучаю разные сигналы, и все они имеют одинаковые параметры.

Структура выглядит следующим образом:

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

Это становится действительно утомительным для программирования и обслуживания, когда вы проходите как 10 команд.Есть ли способ сделать это лучше?

Я думал о создании QMap, поиске и выдаче сигнала, который я получаю.Возможно ли в Qt иметь указатель на функцию и опускать его таким образом?

Ответы [ 2 ]

4 голосов
/ 14 мая 2019

Нет никакой разницы между

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);
0 голосов
/ 14 мая 2019

Если все сигналы содержат одинаковые 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);
    }
    //...
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...