我需要将QSqlRecord转换为QVariant并返回整个项目。为了做到这一点,我添加了
Q_DECLARE_METATYPE(QSqlRecord);
在需要转换的类的.h文件中。 我还有一个基类,几个子节点从中继承,在这种情况下,我假设在基类中只包含一次Q_DECLARE_METATYPE就足够了。因此,我有例如:
当我尝试运行这样的程序时,我得到了
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_DECLARE_METATYPE的工作方式来看,这意味着如果我声明它,它会导致错误,因为它已经在其他地方声明了,但是如果我没有声明它,我就无法从QVariant转换,因为它不会将对象识别为有效的QVariant,我缺少什么?
答案 0 :(得分:5)
您应该将Q_DECLARE_METATYPE(QSqlRecord)放在一个标题中,然后只需将其包含在它所需的位置即可。 Q_DECLARE_METATYPE(QSqlRecord)必须位于任何类和名称空间之外。 From Qt documentation:
理想情况下,此宏应放在类或结构的声明下面。如果那是不可能的,可以将它放在一个私有头文件中,每次在QVariant中使用该类型时都必须包含该文件
答案 1 :(得分:3)
您对具有公共构造函数,析构函数,复制构造函数的类使用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