Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用头文件和源文件时,在何处放置Q_DECLARE_元类型语句?_C++_Qt - Fatal编程技术网

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)