我已经使用以下代码将boost::posix_time::ptime注册到QT
Q_DECLARE_METATYPE(boost::posix_time::ptime);不过,我还是会犯错误
错误1错误C2338:类型未注册,请使用Q_DECLARE_METATYPE宏将其告知Qt的元对象系统。
有什么建议吗?
发布于 2014-01-23 19:34:49
请记住,Q_DECLARE_METATYPE只是为您的类型定义了QMetaTypeId的专门化。它只对后面的代码有用,在同一个文件中。它的意思是放在一个标头中,在其中声明给定的类型。因此,如果您有一个自定义类型FooType,那么应该将Q_DECLARE_METATYPE直接放在声明之后,并放在全局命名空间中。
因此,理想情况下,您需要做的是修改boost的副本,并在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如果您不想修改boost的副本,那么在中使用此类型的每个文件都必须添加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。
https://stackoverflow.com/questions/21299388
复制相似问题