在Qt中注册自定义元类型的别名类型
Registering aliases types of custom MetaType in Qt
我在datamodel.h
头文件中有一个简单的自定义类型XyztReal
及其别名:
#ifndef IMUCONTROLLERDATAMODEL_H
#define IMUCONTROLLERDATAMODEL_H
#include <QMetaType>
namespace imu_controller {
namespace data {
// some code
struct __attribute__((__packed__)) XyztReal {
qreal x ;
qreal y ;
qreal z ;
qreal ts;
};
typedef XyztReal GyrReal;
typedef XyztReal AccReal;
typedef XyztReal MagReal;
void registerTypes();
}
}
Q_DECLARE_METATYPE(imu_controller::data::XyztReal)
#endif // IMUCONTROLLERDATAMODEL_H
和源datamodel.cpp
中的注册功能:
void registerTypes()
{
qRegisterMetaType<XyztReal>("XyztReal"); // or qRegisterMetaType<XyztReal>();
qRegisterMetaType<GyrReal >("GyrReal" );
qRegisterMetaType<AccReal >("AccReal" );
qRegisterMetaType<MagReal >("MagReal" );
}
所以我在程序的适当位置调用这个函数,并尝试连接不同线程中某些对象的信号/插槽,如下所示:
Qt::ConnectionType ct = static_cast<Qt::ConnectionType>(Qt::BlockingQueuedConnection | Qt::UniqueConnection);
connect(data_ctrl, &imu_controller::DataController::gyrRealReady, this, &MainWindow::someSlot, ct);
其中信号/插槽分别具有imu_controller::data::GyrReal
和imu_controller::data::XyztReal
参数类型,或者:
Qt::ConnectionType ct = static_cast<Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection);
connect(data_ctrl, &imu_controller::DataController::gyrRealReady, this, &MainWindow::onImuGyrRealReceived, ct);
其中信号/插槽具有imu_controller::data::GyrReal
参数类型,但程序不起作用并且调试器打印:
QObject::connect:无法对类型为"imu_controller::d ata::GyrReal"的参数进行排队 (确保 'imu_controller::d ata::GyrReal' 是使用 qRegisterMetaType(( 注册的。
适用于所有XyztReal
别名类型。
重要提示:如果类信号类型更改为XyztReal
类型imu_controller::DataController
程序有效!
PS:我认为类型注册的问题。 我阅读了qt文档和几个主题,但没有找到解决方案或任何示例。
据我了解,qRegisterMetaType
的const char * typeName
论点在这里是非常必要的。此外,它还需要在命名空间方面保持一致性。
假设您在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
,每个可能的别名与每个可能的命名空间组合对应一个。
- 继承模板类中的类型别名
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 如何使用类型别名从模板化类中隐藏模板列表
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- 通过类型别名从构造函数转发模板推导
- C++中的严格别名规则和类型别名
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 什么是C++中的类型别名?
- 如何在不违反类型别名规则的情况下解释消息负载?
- 在模板派生类中继承具有类型别名的构造函数
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 使用类型别名,例如使用 A = int(int)
- 模板类函数指针类型别名
- 类型别名和类似类型
- 泛型类型别名,它们彼此不兼容
- 具有类型别名的循环依赖项
- 为什么模板引用类型不能用作模板类型别名参数?