C++ 使用头文件和源文件时,在何处放置Q_DECLARE_元类型语句?
我正在C++ 使用头文件和源文件时,在何处放置Q_DECLARE_元类型语句?,c++,qt,C++,Qt,我正在QWizard页面中使用我的自定义struct。让我们假设一个结构(或类)如下: 我希望能够使用nm::Foo类型的Q_属性来registerField,例如: // within some QWizardPage class Q_PROPERTY(nm::Foo foo READ getFoo WRITE setFoo) 我知道为了使用它,我必须将其声明为Qt元类型: Q_DECLARE_METATYPE(nm::Foo) 但我不知道在哪里正确地放置上述声明。我试图将其放在Foo.c
QWizard
页面中使用我的自定义struct
。让我们假设一个结构
(或类
)如下:
我希望能够使用nm::Foo
类型的Q_属性来registerField
,例如:
// within some QWizardPage class
Q_PROPERTY(nm::Foo foo READ getFoo WRITE setFoo)
我知道为了使用它,我必须将其声明为Qt元类型:
Q_DECLARE_METATYPE(nm::Foo)
但我不知道在哪里正确地放置上述声明。我试图将其放在Foo.cpp
的末尾,但出现编译错误:
path/QtCore/qglobal.h:738:错误:静态断言失败:类型未注册,请使用Q_DECLARE_元类型宏使Qt的元对象系统知道它#定义Q_STATIC_ASSERT_X(条件,消息)STATIC_ASSERT(bool(条件),消息)
如果我把它放在头文件的末尾,同时还有一个源文件,我会得到:
/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h:149:错误:在“typedef”之前需要构造函数、析构函数或类型转换
typedef PTRDIFF_TYPE PTRDIFF_t
如果我将所有定义移动到Foo.h
并将其用作仅头文件,那么如果我将语句放在文件的末尾(命名空间之外),它就可以工作。但是,我的类定义有点长,我希望我的类定义放在源文件中
当我的类有头文件和源文件而不是只有头文件时,有什么方法可以使用Q\u DECLARE\u METATYPE
编辑(解决方案):我必须完全定义我的类,即提供公共默认ctor、复制ctor和dtor。最后的代码如下所示:
// somewhere in Foo.h
#include <QMetaType>
namespace nm{
struct Foo
{
Foo();
Foo(const Foo& other);
~Foo();
void bar();
};
}
Q_DECLARE_METATYPE(nm::Foo)
//在Foo.h中的某个地方
#包括
名称空间nm{
结构Foo
{
Foo();
Foo(const Foo&其他);
~Foo();
空心钢筋();
};
}
Q_DECLARE_元类型(nm::Foo)
来自(重点是我的):
只要该宏提供了公共默认构造函数、公共复制构造函数和公共析构函数,它就会使类型为所知。需要将该类型用作中的自定义类型
此宏要求该类型在其使用点是一个完全定义的类型
这就是为什么只使用头的解决方案有效,而且在将类型声明为元类型之前,除了提供类型的完整定义之外,别无选择。Q\u DECLARE\u metatype
放在头文件中。这里有一个关于名称空间的示例:请注意,文档中指出,如果MyStruct位于名称空间中,则Q_DECLARE_METATYPE()宏必须位于名称空间之外:
// somewhere in Foo.h
#include <QMetaType>
namespace nm{
struct Foo
{
Foo();
Foo(const Foo& other);
~Foo();
void bar();
};
}
Q_DECLARE_METATYPE(nm::Foo)