首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何和何时使用Q_DECLARE_METATYPE

如何和何时使用Q_DECLARE_METATYPE
EN

Stack Overflow用户
提问于 2017-03-16 09:09:01
回答 2查看 26.7K关注 0票数 15

我需要将一个QSqlRecord转换为QVariant,然后在整个项目中返回。为了做到这一点,我添加了

代码语言:javascript
复制
Q_DECLARE_METATYPE(QSqlRecord);

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

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

当我试图像这样运行程序时,我会得到

代码语言:javascript
复制
Redefinition of 'QMetaTypeId<QSqlRecord>

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

代码语言:javascript
复制
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,我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-16 09:24:50

您应该将Q_DECLARE_METATYPE(QSqlRecord)放在一个标头中,然后将它包含到它需要的任何位置。Q_DECLARE_METATYPE(QSqlRecord)必须位于任何类和命名空间之外。来自Qt文档

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

票数 15
EN

Stack Overflow用户

发布于 2017-03-16 09:24:50

您可以在类上使用Q_DECLARE_METATYPE和公共构造函数、析构函数、复制构造函数,因此QSqlRecord适合.只需确保每个类声明只使用该宏一次。可能你错过了一些#pragma once

在类声明之后,在您自己的类上使用它,外部名称空间大括号:

代码语言:javascript
复制
//mystruct.h
namespace MyNamespace
{
struct MyStruct
{
    int i;
    ...
};
}

Q_DECLARE_METATYPE(MyNamespace::MyStruct)

参见这里的文档:金属陶瓷

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42829568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档