Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中注册自定义元类型的别名_C++_Qt_Typedef_Qt Signals_Qmetatype - Fatal编程技术网

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());
}