Насколько я понимаю, аргумент const char * typeName
qRegisterMetaType
здесь совершенно необходим. Также требуется согласованность в отношении пространств имен.
Допустим, у вас есть этот сигнал в вашем DataController
классе:
signals:
void some_signal(data::AccReal);
Поскольку класс находится в пространстве имен imu_controller
, вы просто добавляете data
пространство имен перед именем класса аргумента.
Теперь в вашей функции registerTypes
оно должно быть зарегистрировано так:
qRegisterMetaType<AccReal >("data::AccReal");
Другими словами, typeName
Строка должна точно соответствовать типу аргумента сигнала , как там написано .
Похоже, можно зарегистрировать тип более одного раза, указав разные имена типов, например
qRegisterMetaType<AccReal >("AccReal");
qRegisterMetaType<AccReal >("data::AccReal");
qRegisterMetaType<AccReal >("imu_controller::data::AccReal");
Любопытно, что если у вас где-то есть
using WhatEver = imu_controller::data::AccReal;
, то вы можете иметь
signals:
void some_signal(WhatEver);
, если у вас есть
qRegisterMetaType<AccReal >("WhatEver");
Суммировать В общем, ваша функция регистрации может быть такой:
QString aliases[] = {"XyztReal", "GyrReal", "AccReal", "MagReal" };
for(auto a : aliases)
{
qRegisterMetaType<XyztReal>(a.toLatin1());
a.prepend("data::");
qRegisterMetaType<XyztReal>(a.toLatin1());
a.prepend("imu_controller::");
qRegisterMetaType<XyztReal>(a.toLatin1());
}
т.е. вы можете зарегистрировать XyztReal
несколько раз, по одному для каждого возможного псевдонима с каждой возможной комбинацией пространств имен.