我已使用以下代码
向QT注册boost::posix_time::ptime
Q_DECLARE_METATYPE(boost::posix_time::ptime);
但是我仍然收到错误
错误1错误C2338:类型未注册,请使用 Q_DECLARE_METATYPE宏使Qt的元对象系统知道
有什么建议吗?
答案 0 :(得分:0)
请记住,Q_DECLARE_METATYPE
仅为您的类型定义QMetaTypeId
的特化。它仅对其后面的代码有用,在同一个文件中。它应该放在声明给定类型的标题中。因此,如果您有自定义类型FooType
,则可以在声明之后直接放置Q_DECLARE_METATYPE
,并在全局命名空间中放置。
所以,您理想情况下需要做的是修改您的提升副本并在posix_time.hpp
末尾添加以下内容:
#if defined(QT_CORE_LIB) && !defined(Q_DECLARE_METATYPE)
#include <QMetaType>
#endif
#if defined(Q_DECLARE_METATYPE)
Q_DECLARE_METATYPE(boost::posix_time::prime)
#endif
如果您不想修改您的提升副本,那么在您使用此类型的每个文件中,您必须添加Q_DECLARE_METATYPE(boost::posix_time::prime)
。至少,这必须是由moc 和处理的每个文件都使用该类型! moc生成的代码将包含moc已处理的标头,并且Q_DECLARE_METATYPE
声明必须在这些标头中可见。
您可能只想将其放入my boost_posix_time.hpp
标题中,这样您就不会忘记这样做:
//myboost_posix_time.hpp
#include <QMetaType>
#include "boost/date_time/posix_time/posix_time.hpp"
Q_DECLARE_METATYPE(boost::posix_time::ptime)
//myobject.h
#include "myboost_posix_time.hpp"
#include <QObject>
class MyObject : public QObject {
...
Q_SLOT void useTime(boost::posix_time::ptime);
...
};
您还必须在qRegisterMetaType<boost::posix_time::ptime>
中添加main()
。同样,无论您在元类型系统中使用该类型,您都必须拥有Q_DECLARE_METATYPE
。