헤더 파일 XyztReal
에 간단한 사용자 지정 유형 과 별칭이 datamodel.h
있습니다.
#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
인수를 모두 입력,하지만이 프로그램은 작동하고 debuger 인쇄하지 않습니다
QObject :: connect : 'imu_controller :: data :: GyrReal'유형의 인수를 큐에 넣을 수 없습니다 ( 'imu_controller :: data :: GyrReal'이 qRegisterMetaType ()을 사용하여 등록되었는지 확인하십시오.)
모든 XyztReal
별칭 유형에 대해.
중요 :imu_controller::DataController
클래스 신호 유형이 유형으로 변경 되면 프로그램이 작동합니다 XyztReal
!
추신 : 유형 등록 문제라고 생각합니다. qt 문서와 여러 주제를 읽었지만 해결책이나 예를 찾지 못했습니다.
내가 이해하는 한, 여기 에서의 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
, 가능한 모든 네임 스페이스 조합으로 가능한 별칭마다 하나씩 여러 번 등록 할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다