如何以及何时使用 Q_DECLARE_METATYPE

     2023-02-16     57

关键词:

【中文标题】如何以及何时使用 Q_DECLARE_METATYPE【英文标题】:How and when to use Q_DECLARE_METATYPE 【发布时间】:2017-03-16 09:09:01 【问题描述】:

我需要将 QSqlRecord 转换为 QVariant 并在整个项目中返回。为此,我添加了

Q_DECLARE_METATYPE(QSqlRecord);

在需要转换的类的 .h 文件中。 我还有一个基类,几个子类从该基类继承,在这种情况下,我假设在基类中只包含一次 Q_DECLARE_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_DECLARE_METATYPE 工作原理的理解,这意味着如果我声明它,它会导致错误,因为它已经在其他地方声明,但如果我不声明它,我不能从 QVariant 转换,因为它没有将对象识别为有效的 QVariant,我缺少什么?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢您的回复,我确实将 Q_DECLARE_METATYPE 放在了命名空间之外,但是它位于另一个类的 .h 文件中。我是否应该只创建一个包含我需要的所有 Q_DECLARE_METATYPE 的特定 .h 文件,并在需要时包含它? 来自 Qt 文档的@NicoloCastro >理想情况下,这个宏应该放在类或结构的声明之下。如果这是不可能的,它可以放在一个私有头文件中,每次在 QVariant 中使用该类型时都必须包含该头文件。 好的,谢谢,抱歉,我浏览了一下,显然没有注册该段落。【参考方案2】:

您在具有公共构造函数、析构函数、复制构造函数的类上使用 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

【讨论】:

为什么我不应该在 Qt 的类上使用声明元类型?如何将 QVariant 转换为 Qt 类?还是不应该允许我这样做? 抱歉,我从文档中刷新了我的信息并快速修复了答案。 哦,好的,谢谢。所以在我写的我知道我会强制转换的类中,我可以将声明直接放在同一个文件中,在命名空间之外,对于其他人我必须包含它,但这是我的问题,现在如果我包含它告诉我它已经包含(重新定义'QMetaTypeId)如果我删除它,它告诉我我没有声明它。 这看起来你的 .h 文件确实缺少包含保护(#pragma once 或 #ifndef FILENAME #define FILENAME)

SignInManager,它是啥以及如何使用,何时使用?

】SignInManager,它是啥以及如何使用,何时使用?【英文标题】:SignInManager,whatitisandhow,whentouse?SignInManager,它是什么以及如何使用,何时使用?【发布时间】:2016-11-2122:35:51【问题描述】:我正在探索SignInManager类。但是MSDN上给... 查看详情

何时以及如何使用 Tornado?啥时候没用?

】何时以及如何使用Tornado?啥时候没用?【英文标题】:WhenandhowtouseTornado?Whenisituseless?何时以及如何使用Tornado?什么时候没用?【发布时间】:2011-05-1121:41:21【问题描述】:好的,Tornado是非阻塞的,速度非常快,它可以轻松处... 查看详情

java示例代码_何时以及如何使用ThreadLocal变量

java示例代码_何时以及如何使用ThreadLocal变量 查看详情

如何以及何时使用 Ember.Application 注册和注入方法?

】如何以及何时使用Ember.Application注册和注入方法?【英文标题】:HowandwhentouseEmber.Applicationregisterandinjectmethods?【发布时间】:2013-08-1502:45:04【问题描述】:我正在尝试了解如何使用Ember.Applicationregister和inject方法这些函数的设计... 查看详情

何时以及如何使用 PySide QEventLoop

】何时以及如何使用PySideQEventLoop【英文标题】:whenandhowtousePySideQEventLoop【发布时间】:2013-06-1208:02:34【问题描述】:我有一个应用程序,我尝试使用while循环但应用程序只是挂起,现在我认为我需要使用QEventLoop使应用程序工作... 查看详情

我如何知道何时索引列以及使用啥索引?

】我如何知道何时索引列以及使用啥索引?【英文标题】:HowdoIknowwhentoindexacolumn,andwithwhat?我如何知道何时索引列以及使用什么索引?【发布时间】:2011-05-0420:58:47【问题描述】:在各种ORM的文档中,它们总是提供一种创建索引... 查看详情

htmlspecialchars() - 如何以及何时使用和避免多次使用

】htmlspecialchars()-如何以及何时使用和避免多次使用【英文标题】:htmlspecialchars()-Howandwhentouseandavoidmultipleuse【发布时间】:2011-02-2618:59:20【问题描述】:我正在为我的老板建立一个PHP内部网。一个简单的客户、订单、报价系统。... 查看详情

我应该如何以及何时使用 on.exit?

】我应该如何以及何时使用on.exit?【英文标题】:HowandwhenshouldIuseon.exit?【发布时间】:2015-04-0218:07:24【问题描述】:on.exit在函数退出时调用代码,但我应该如何以及何时使用它?【问题讨论】:Python的with语句的(粗略的)R等... 查看详情

Laravel Eloquent - orWhereHas 方法 - 何时使用以及如何使用

】LaravelEloquent-orWhereHas方法-何时使用以及如何使用【英文标题】:LaravelEloquent-orWhereHasmethod-Whentouseitandhow【发布时间】:2021-03-1721:03:57【问题描述】:我正在尝试了解一些高级的eloquent命令,在Laravel官方文档中,没有太多关于Eloq... 查看详情

JSF 中的“绑定”属性如何工作?何时以及如何使用它?

】JSF中的“绑定”属性如何工作?何时以及如何使用它?【英文标题】:Howdoesthe\'binding\'attributeworkinJSF?Whenandhowshoulditbeused?【发布时间】:2015-11-1105:26:22【问题描述】:有很多材料可以区分JSF中的value属性和binding属性。我对这两... 查看详情

JSF 中的“绑定”属性如何工作?何时以及如何使用它?

】JSF中的“绑定”属性如何工作?何时以及如何使用它?【英文标题】:Howdoesthe\'binding\'attributeworkinJSF?Whenandhowshoulditbeused?【发布时间】:2014-11-2815:22:05【问题描述】:有很多材料可以区分JSF中的value属性和binding属性。我对这两... 查看详情

JSF 中的“绑定”属性如何工作?何时以及如何使用它?

】JSF中的“绑定”属性如何工作?何时以及如何使用它?【英文标题】:Howdoesthe\'binding\'attributeworkinJSF?Whenandhowshoulditbeused?【发布时间】:2013-04-1604:32:42【问题描述】:有很多材料可以区分JSF中的value属性和binding属性。我对这两... 查看详情

numpy.newaxis 如何工作以及何时使用它?

】numpy.newaxis如何工作以及何时使用它?【英文标题】:Howdoesnumpy.newaxisworkandwhentouseit?【发布时间】:2015-05-2806:16:33【问题描述】:当我尝试时numpy.newaxis结果给了我一个二维图框,x轴从0到1。但是,当我尝试使用numpy.newaxis对向量... 查看详情

如何以及何时在 C# 中使用 :short?

】如何以及何时在C#中使用:short?【英文标题】:Howandwhentouse:shortinC#?【发布时间】:2018-12-0311:17:04【问题描述】:我想知道在C#中何时使用:short?请帮助我想使用它而不是int。使用short是好主意还是坏主意?【问题讨论】:不是... 查看详情

如何判断 Postgres 表何时聚集以及使用了哪些索引

】如何判断Postgres表何时聚集以及使用了哪些索引【英文标题】:HowtotellwhenaPostgrestablewasclusteredandwhatindexeswereused【发布时间】:2018-11-1411:58:31【问题描述】:集群带来的性能提升给我留下了深刻的印象,但它需要多长时间。我知... 查看详情

有人可以解释一下如何以及何时应该在 oracle 中使用 syscursor 吗? [关闭]

】有人可以解释一下如何以及何时应该在oracle中使用syscursor吗?[关闭]【英文标题】:Cansomeonegivemeaexplanationabouthowandwhenshouldusesyscursorinoracle?[closed]【发布时间】:2017-01-1903:42:53【问题描述】:以syscursor为例进行说明。什么时候在p... 查看详情

如何理解 SpatialDropout1D 以及何时使用它?

】如何理解SpatialDropout1D以及何时使用它?【英文标题】:HowtounderstandSpatialDropout1Dandwhentouseit?【发布时间】:2018-10-2720:28:24【问题描述】:有时我看到一些模型使用SpatialDropout1D而不是Dropout。例如,在词性标注神经网络中,他们... 查看详情

如何以及何时放弃在 C# 中使用数组?

】如何以及何时放弃在C#中使用数组?【英文标题】:HowandwhentoabandontheuseofarraysinC#?【发布时间】:2010-09-0917:04:45【问题描述】:我一直被告知向数组中添加元素是这样发生的:数组+1个元素的空副本是创建,然后从然后将原始数... 查看详情