首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Q_DECLARE_METATYPE of `boost::posix_time::ptime`

Q_DECLARE_METATYPE of `boost::posix_time::ptime`
EN

Stack Overflow用户
提问于 2014-01-23 04:29:31
回答 1查看 747关注 0票数 1

我已经使用以下代码将boost::posix_time::ptime注册到QT

代码语言:javascript
复制
Q_DECLARE_METATYPE(boost::posix_time::ptime);

不过,我还是会犯错误

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2014-01-23 19:34:49

请记住,Q_DECLARE_METATYPE只是为您的类型定义了QMetaTypeId的专门化。它只对后面的代码有用,在同一个文件中。它的意思是放在一个标头中,在其中声明给定的类型。因此,如果您有一个自定义类型FooType,那么应该将Q_DECLARE_METATYPE直接放在声明之后,并放在全局命名空间中。

因此,理想情况下,您需要做的是修改boost的副本,并在posix_time.hpp的末尾添加以下内容

代码语言:javascript
复制
#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

如果您不想修改boost的副本,那么在中使用此类型的每个文件都必须添加Q_DECLARE_METATYPE(boost::posix_time::prime)。至少,这必须是由moc处理并使用类型的每个文件!由moc生成的代码将包括moc已处理的标头,而Q_DECLARE_METATYPE声明必须在这些标头中可见。

您可能希望简单地将其放入my boost_posix_time.hpp头中,这样您就不会忘记这样做:

代码语言:javascript
复制
//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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21299388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档