2014-01-23 38 views
1

我已经注册boost::posix_time::ptime使用下面的代码Q_DECLARE_METATYPE的`提振::了posix_time :: ptime`

Q_DECLARE_METATYPE(boost::posix_time::ptime); 

不过,我仍然得到错误

错误1错误C2338 QT间期:类型是未注册,请使用 Q_DECLARE_METATYPE宏使其知道Qt的元对象系统

任何建议?

+0

您需要注册它们,而不仅仅是声明。你应该使用'qRegisterMetaType'函数。 'qRegisterMetaTypeStreamOperators'函数用于具有流操作符的类型。 –

+0

我同时尝试了Q_DECLARE_METATYPE和qRegisterMetaType,但这也没有帮助。我得到了同样的回应 – MistyD

回答

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

还必须在main()添加qRegisterMetaType<boost::posix_time::ptime>。再次,无论您使用metatype系统使用哪种类型,您都必须拥有Q_DECLARE_METATYPE

相关问题