Я хочу иметь возможность отправлять сигналы Qt по сети. Сериализация вызова сигнала довольно проста с использованием системы метатипов Qt:
- Создайте
qMetaMethod
с помощью статического метода::fromSignal
- Получите имя метода, имена параметров, их идентификаторы типов
[1]
и значения, используя созданный метаметод. - Упакуйте все в нужный формат (JSON, XML) и отправьте.
Но пока я не мог понять, как вызвать сигнал, используя сериализованные данные: QMetaObject::invokeMethod(..)
принимает имя сигнала/метода в виде строки. Проблема заключается в аргументах: они должны быть представлены как QGenericArgument
, и их можно создать только с помощью макроса Q_ARG
, для которого требуется фактический тип (а не строка его имени или typeId
) и соответствующее значение. Также количество аргументов должно быть определено во время компиляции, нет invokeMethod(..)
, который принимает список аргументов.
Я что-то упускаю? Или есть лучший/альтернативный способ сделать это?
[1]
Дополнительный вопрос: как обеспечить, чтобы типы всегда получали один и тот же typeId при регистрации с использованием Q_DECLARE_METATYPE(..)
?
QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QHostAddress &host, quint16 port)
? - person rgmt   schedule 22.07.2016