C++ 在Qt中注册自定义元类型的别名
我在我的C++ 在Qt中注册自定义元类型的别名,c++,qt,typedef,qt-signals,qmetatype,C++,Qt,Typedef,Qt Signals,Qmetatype,我在我的datamodel.h头文件中有一个简单的自定义类型XyztReal及其别名: #ifndef IMUCONTROLLERDATAMODEL_H #define IMUCONTROLLERDATAMODEL_H #include <QMetaType> namespace imu_controller { namespace data { // some code struct __attribute__((__packed__)) XyztReal { qr
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
因此,我在程序中的适当位置调用此函数,并尝试在不同线程中连接某些对象的信号/插槽,如下所示:
Qt::ConnectionType ct = static_cast<Qt::ConnectionType>(Qt::BlockingQueuedConnection | Qt::UniqueConnection);
connect(data_ctrl, &imu_controller::DataController::gyrRealReady, this, &MainWindow::someSlot, ct);
qRegisterMetaType<AccReal >("data::AccReal");
其中,信号/插槽具有imu\u控制器::数据::GyrReal
参数类型,但程序不工作,调试程序打印:
QObject::connect:无法对类型为“imu\U controller::data::Gyreal”的参数排队
(确保使用qRegisterMetaType()注册了“imu\U控制器::数据::GyrReal”。)
对于所有XyztReal
别名类型
重要提示:
如果imu\u controller::DataController
类信号类型更改为XyztReal
类型,则该程序工作
PS:
我认为问题出在类型注册上。
我阅读了qt文档和几个主题,但没有找到解决方案或任何示例。据我所知,
qRegisterMetaType
的const char*typeName
参数在这里非常必要。它还需要名称空间方面的一致性
假设您的DataController
类中有此信号:
signals:
void some_signal(data::AccReal);
由于类位于imu\u controller
名称空间中,因此只需在参数类名称之前添加data
名称空间
现在,在您的registerTypes
函数中,它应该像这样注册:
Qt::ConnectionType ct = static_cast<Qt::ConnectionType>(Qt::BlockingQueuedConnection | Qt::UniqueConnection);
connect(data_ctrl, &imu_controller::DataController::gyrRealReady, this, &MainWindow::someSlot, ct);
qRegisterMetaType<AccReal >("data::AccReal");
奇怪的是,如果你有
using WhatEver = imu_controller::data::AccReal;
在某个地方,你可以
signals:
void some_signal(WhatEver);
只要你有
qRegisterMetaType<AccReal >("WhatEver");
qRegisterMetaType(“任意”);
总结一下,您的注册函数可以是:
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());
}
QString别名[]={“XyztReal”、“GyrReal”、“acreal”、“MagReal”};
用于(自动a:别名)
{
qRegisterMetaType(a.toLatin1());
a、 前置(“数据:”);
qRegisterMetaType(a.toLatin1());
a、 前置(“imu\U控制器::”;
qRegisterMetaType(a.toLatin1());
}
i、 e.您可以多次注册
XyztReal
,每种可能的名称空间组合对应一个别名。是的,谢谢。需要明确的是,const char*typeName
应该始终包含完整的命名空间
路径?我的信号为imu\u控制器::数据::增量
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());
}