我已经注册boost::posix_time::ptime
使用下面的代码Q_DECLARE_METATYPE的`提振::了posix_time :: ptime`
Q_DECLARE_METATYPE(boost::posix_time::ptime);
不过,我仍然得到错误
错误1错误C2338 QT间期:类型是未注册,请使用 Q_DECLARE_METATYPE宏使其知道Qt的元对象系统
任何建议?
我已经注册boost::posix_time::ptime
使用下面的代码Q_DECLARE_METATYPE的`提振::了posix_time :: ptime`
Q_DECLARE_METATYPE(boost::posix_time::ptime);
不过,我仍然得到错误
错误1错误C2338 QT间期:类型是未注册,请使用 Q_DECLARE_METATYPE宏使其知道Qt的元对象系统
任何建议?
请记住,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
。
您需要注册它们,而不仅仅是声明。你应该使用'qRegisterMetaType'函数。 'qRegisterMetaTypeStreamOperators'函数用于具有流操作符的类型。 –
我同时尝试了Q_DECLARE_METATYPE和qRegisterMetaType,但这也没有帮助。我得到了同样的回应 – MistyD