`boost :: posix_time :: ptime`的Q_DECLARE_METATYPE

时间:2014-01-23 04:29:31

标签: c++ qt

我已使用以下代码

向QT注册boost::posix_time::ptime
Q_DECLARE_METATYPE(boost::posix_time::ptime);

但是我仍然收到错误

  

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

有什么建议吗?

1 个答案:

答案 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