c++ 如何以及何时使用Q_DEQUE_METATYPE

zlhcx6iw  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(116)

我需要在整个项目中将QSqlRecord转换为QVariant并返回。

Q_DECLARE_METATYPE(QSqlRecord);

字符串
在需要转换的类的.h文件中。我也有一个基类,几个孩子继承了它,在这种情况下,我假设在基类中只包含一次Q_DERISE_METATYPE就足够了。因此,我有这样的例子:

  • widgetBaseClass:声明元类型
  • widgetChildClass1:继承widgetBaseClass不声明元类型
  • widgetChildClass2:继承widgetBaseClass不声明元类型
  • myTableModel:声明元类型

当我试着这样运行程序时,

Redefinition of 'QMetaTypeId<QSqlRecord>


从widgetBaseClass,指向myTableModel中的前一个声明。如果另一方面,我删除了我得到的声明:

static_assert failed "Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system");


从我对Q_DEFILE_METATYPE的工作原理的理解来看,这意味着如果我声明它,它会导致一个错误,因为它已经在其他地方声明了,但是如果我不声明它,我就不能从QVariant转换,因为它不能识别对象作为一个有效的QVariant,我错过了什么?

j2datikz

j2datikz1#

您应该将Q_DECLARE_METATYPE(QSqlRecord)仅放在一个头中,然后在需要它的任何地方都包含它。
Q_DECLARE_METATYPE(QSqlRecord)必须在任何类和命名空间之外。
From Qt documentation

  • 理想情况下,这个宏应该放在类或结构的声明下面。如果不可能,它可以放在一个私有头文件中,每次在QVariant中使用该类型时都必须包含该文件。*
tzdcorbm

tzdcorbm2#

你在有公共构造函数,析构函数,复制构造函数的类上使用Q_DECLARE_METATYPE,所以QSqlRecord适合。只要确保这个宏在每个类声明中只使用一次。可能你错过了一些#pragma once
在声明类之后,在命名空间括号之外,在您自己的类上使用它:

//mystruct.h
namespace MyNamespace
{
struct MyStruct
{
    int i;
    ...
};
}

Q_DECLARE_METATYPE(MyNamespace::MyStruct)

字符串
请参阅文档:http://doc.qt.io/qt-5/qmetatype.html#Q_DECLARE_METATYPE

相关问题