我需要将一个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,我遗漏了什么?
发布于 2017-03-16 09:24:50
您应该将Q_DECLARE_METATYPE(QSqlRecord)放在一个标头中,然后将它包含到它需要的任何位置。Q_DECLARE_METATYPE(QSqlRecord)必须位于任何类和命名空间之外。来自Qt文档
理想情况下,这个宏应该放在类或结构的声明下面。如果这是不可能的,则可以将其放入私有头文件中,每次在QVariant中使用该类型时都必须包含该文件。
发布于 2017-03-16 09:24:50
您可以在类上使用Q_DECLARE_METATYPE和公共构造函数、析构函数、复制构造函数,因此QSqlRecord适合.只需确保每个类声明只使用该宏一次。可能你错过了一些#pragma once
在类声明之后,在您自己的类上使用它,外部名称空间大括号:
//mystruct.h
namespace MyNamespace
{
struct MyStruct
{
int i;
...
};
}
Q_DECLARE_METATYPE(MyNamespace::MyStruct)参见这里的文档:金属陶瓷
https://stackoverflow.com/questions/42829568
复制相似问题