如何使用 qRegisterMetaType 而不是 Q_ENUM?

     2023-02-17     253

关键词:

【中文标题】如何使用 qRegisterMetaType 而不是 Q_ENUM?【英文标题】:How to use qRegisterMetaType instead of Q_ENUM? 【发布时间】:2019-07-01 03:04:23 【问题描述】:

这是我的包含 Q_ENUM 的类。由于我使用 QVariant,我需要使用 Q_ENUM。原因在我的应用程序中,有一个部分我们调用 qRegisterMetaType,如果可能,我们希望仅在 1 个位置注册元类型。

是否可以使用 qRegisterMetaType 代替 Q_ENUM?是否有性能原因?

class MyEnums : public QObject

    public:
        enum class SettingType
        
            Integer,
            String,
            Boolean,
            Float,
            Double,
            Enum,
        ;

        Q_ENUM(SettingType)
;

【问题讨论】:

“原因在我的应用程序中,有一个部分我们调用 qRegisterMetaType,如果可能的话,我们希望只在 1 个位置注册元类型。” 【参考方案1】:
    您无需调用qRegisterMetaType() 即可使用带有QVariant 的类型。一般情况下,您只需要Q_DECLARE_METATYPE()。 您只需要调用qRegisterMetaType(),如果该类型将用于排队的信号/插槽连接,或者使用QObject::property API。请注意,对于枚举类型,在这些情况下您甚至不需要调用 qRegisterMetaType()。 要拨打qRegisterMetaType(),您仍然需要使用Q_DECLARE_METATYPE()。因此,使用qRegisterMetaType(),您只需将Q_ENUM() 换成Q_DECLARE_METATYPE()

    使用Q_ENUM() 允许您在运行时检索枚举值的名称:

    qDebug() << MyEnums::Integer // Will print "MyEnums::Integer" if using Q_ENUM()
                                 // Will print "0" if using Q_DECLARE_METATYPE()
    

【讨论】:

【参考方案2】:

首先,您需要将 Q_OBJECT 宏添加到您的枚举类中,如果没有该宏,您将无法使用 Q_DECLARE_METATYPE 声明它,您需要 Q_DECLARE_METATYPE 因为没有它,您向 qRegisterMetaType 注册的 MetaType 将无法使用 QVariant

所以你的类声明可能如下所示:

class MyEnums : public QObject

    public:
        enum class SettingType
        
            Integer,
            String,
            Boolean,
            Float,
            Double,
            Enum,
        ;

        //Q_ENUM(SettingType)
        Q_OBJECT
;

Q_DECLARE_METATYPE(MyEnums::SettingType);

在那次通话之后:qRegisterMetaType&lt;MyEnums::SettingType&gt;(); somethere before using your type.

测试一下:

qRegisterMetaType<MyEnums::SettingType>();

auto val = MyEnums::SettingType::Double;
QVariant vt = QVariant::fromValue(val);

MyEnums::SettingType test = vt.value<MyEnums::SettingType>();

qDebug() << (test == val);

【讨论】:

q_declare_metatype与qregistermetatype(代码片段)

Q_DECLARE_METATYPE与qRegisterMetaType2010-09-0718:20 来源https://www.cnblogs.com/cute/archive/2011/03/02/1969166.html参考 http://hi.baidu.com/cyclone/blog/item/01108bd40599b00fa18bb793.html 基本理解Q_DECLARE_METATYPE如果要使自定义类型或其他非QMetaType内置类型... 查看详情

为啥 qRegisterMetaType 会抛出错误?

】为啥qRegisterMetaType会抛出错误?【英文标题】:WhydoesqRegisterMetaTypethrowmeanerror?为什么qRegisterMetaType会抛出错误?【发布时间】:2015-04-0909:46:53【问题描述】:我目前正在使用Qt构建一个能够发送和接收通过QSerialPort连接的数据包... 查看详情

qt信号槽传递自定义类型参数(qregistermetatype)

1#include<QMetaType>//记得包含这个头文件2//my_type是我自己定义的类型3qRegisterMetaType<my_type>("my_type");4connect(xx,SIGNAL(xx(my_type)),xx,SLOT(xx(my_type))); https://blog.csdn.net/d_a_r_k/article/d 查看详情

为啥 q_enum 在没有 qRegisterMetaType 的情况下无法获得正确的类型值?

】为啥q_enum在没有qRegisterMetaType的情况下无法获得正确的类型值?【英文标题】:whyq_enumunabletogetcorrecttypevaluewithoutqRegisterMetaType?为什么q_enum在没有qRegisterMetaType的情况下无法获得正确的类型值?【发布时间】:2017-04-2818:34:24【问... 查看详情

如何使用jquery刷新视图组件而不刷新页面

】如何使用jquery刷新视图组件而不刷新页面【英文标题】:howtorefreshviewcomponentwithoutrefreshingpagewithusingjquery【发布时间】:2021-12-0419:10:53【问题描述】:我的视图中有一个视图组件@awaitComponent.InvokeAsync("UserProfileCard")我希望当我点... 查看详情

如何使用函数选择 UITableViewCell,而不点击它?

】如何使用函数选择UITableViewCell,而不点击它?【英文标题】:HowtoselectUITableViewCellusingfunction,withouttappingit?【发布时间】:2017-04-1907:11:15【问题描述】:我正在使用下面提到的数组填充我的tableView。如果用户搜索数组并找到项目... 查看详情

如何在 iOS 中使用 Crashlytics 而不使用 Fabric

】如何在iOS中使用Crashlytics而不使用Fabric【英文标题】:HowtouseCrashlyticswithoutusingFabriciniOS【发布时间】:2016-04-2004:17:16【问题描述】:是否可以在不安装Fabric的情况下使用Crashlytics?现在,我通过使用Fabric来使用Crashlytics。参考资... 查看详情

如何使用 PlistBuddy 添加设置而不覆盖现有设置?

】如何使用PlistBuddy添加设置而不覆盖现有设置?【英文标题】:HowcanIusePlistBuddytoaddsettingswithoutoverridingexistingones?【发布时间】:2015-12-2215:43:52【问题描述】:我正在尝试编写一个脚本,在构建期间将设置添加到设置应用程序,... 查看详情

如何使用 FFMPEG 保存 rtsp 流而不丢包

】如何使用FFMPEG保存rtsp流而不丢包【英文标题】:HowtosavertspstreamwithoutpacketlossbyusingFFMPEG【发布时间】:2016-11-1806:33:22【问题描述】:我正在使用FFMPEG保存实时摄像机流。当我尝试保存视频时,一些数据包丢失,因此视频无法正... 查看详情

如何使用 Getopt 解析参数而不使用前导连字符

】如何使用Getopt解析参数而不使用前导连字符【英文标题】:howtoparseparameterswithoutleadinghyphenwithGetopt【发布时间】:2012-05-0306:20:47【问题描述】:我正在尝试使用Getopt解析命令行参数。但是,我的一些参数来自hostmyhostservermyserver... 查看详情

如何限制单个 Linux 进程的内存使用而不杀死该进程

】如何限制单个Linux进程的内存使用而不杀死该进程【英文标题】:HowLimitmemoryusageforasingleLinuxprocessandnotkilltheprocess【发布时间】:2014-11-1108:45:58【问题描述】:。我知道ulimit可以限制内存使用,但是如果超过限制,就会杀死进程... 查看详情

如何使用 useState 挂钩更新状态而不重新渲染

】如何使用useState挂钩更新状态而不重新渲染【英文标题】:Howtoupdateastatewithoutre-renderingusinguseStatehook【发布时间】:2022-01-1713:37:11【问题描述】:我有一个函数onCondChange,只要用户更改TextField中的值,就会调用它。constonCondChange... 查看详情

编辑数据集时如何使用空间而不删除文本

】编辑数据集时如何使用空间而不删除文本【英文标题】:Howtousespacewithoutdeletingtextwheneditingadataset【发布时间】:2021-01-2019:42:10【问题描述】:我正在通过x3270在大型机上编辑数据集。但是我不知道如何向前移动文本,我只是想... 查看详情

如何使用 redux 只取回一个值而不管理状态

】如何使用redux只取回一个值而不管理状态【英文标题】:Howtousereduxtoonlygetbackavaluewithoutmanagingstate【发布时间】:2020-07-0710:42:49【问题描述】:我正在使用redux的dispatch方法做副作用然后取回一个值。在这种情况下,我对管理状... 查看详情

如何使用依赖:销毁而不造成无限循环

】如何使用依赖:销毁而不造成无限循环【英文标题】:Howusedependent:destroywithoutcausinginfiniteloop【发布时间】:2020-06-0312:14:40【问题描述】:我有两个模型。带有belongs_to:model_two的模型一和带有has_one:model_one的模型二。他们都有depe... 查看详情

如何在火花中使用地图而不实现可序列化?

】如何在火花中使用地图而不实现可序列化?【英文标题】:HowtousemapinsparkwithoutimplementingSerializable?【发布时间】:2020-03-2706:29:53【问题描述】:我在代码中使用了map(),它抛出了NotSerializableException,所以我实现了Serializable。有... 查看详情

如何使用 NSUserDefaults 注册用户默认值而不覆盖现有值?

】如何使用NSUserDefaults注册用户默认值而不覆盖现有值?【英文标题】:HowtoregisteruserdefaultsusingNSUserDefaultswithoutoverwritingexistingvalues?【发布时间】:2010-01-1609:16:58【问题描述】:我有一个带有+(void)initialize方法的AppDelegate类,我用... 查看详情

如何使用 SBT 编译测试而不运行它们

】如何使用SBT编译测试而不运行它们【英文标题】:HowtocompiletestswithSBTwithoutrunningthem【发布时间】:2012-11-3014:11:04【问题描述】:有没有办法在不运行SBT的情况下构建测试?我自己的用例是使用scalac插件对测试代码运行静态分析... 查看详情