Qt Core学习日记——第四天QMetaEnum(下)

news2024/12/24 10:26:13
类定义:

成员变量就只有QMetaObject *mobj和uint handle,handle同样用于计算在qt_meta_stringdata_XTest的位置

成员函数:

接下以test类进行函数讲解

test.h

#pragma once

#include <qobject.h>

#include <QFlags>

class XTest : public QObject

{

Q_OBJECT

Q_CLASSINFO("author", "Sabrina Schweinsteiger")

Q_PROPERTY(bool autoStartup READ autoStartup WRITE setAutoStartup NOTIFY sigAutoStartup)

public:

XTest(QObject* p = nullptr) {}

~XTest() {}

public:

enum Priority

{

High,

Low,

VeryHigh,

VeryLow

};

Q_ENUM(Priority)

enum PriorityFlag

{

High1,

Low1,

VeryHigh1,

VeryLow1

};

Q_FLAG(PriorityFlag)

Q_DECLARE_FLAGS(Alignment, PriorityFlag)

Q_FLAG(Alignment)

//Q_DECLARE_OPERATORS_FOR_FLAGS(Alignment)

public:

bool autoStartup() { return m_autoStartup; }

void setAutoStartup(bool b) { m_autoStartup = b; emit sigAutoStartup(); }

public slots:

void slot1(double* p1) {}

Q_INVOKABLE void slot2(int* p2) {}

Q_REVISION(1) void slot3(char* p3) {}

signals:

void sig1(void * p4);

void sigAutoStartup();

private:

bool m_autoStartup = false;

};

函数定义和声明都写在头文件,为了qt库机制写一个空的test.cpp

test.cpp

#include "XTest.h"

qt生成的moc_test.cpp文件:

/****************************************************************************

** Meta object code from reading C++ file 'XTest.h'

**

** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.2)

**

** WARNING! All changes made in this file will be lost!

*****************************************************************************/

#include <memory>

#include "../../../XTest.h"

#include <QtCore/qbytearray.h>

#include <QtCore/qmetatype.h>

#if !defined(Q_MOC_OUTPUT_REVISION)

#error "The header file 'XTest.h' doesn't include <QObject>."

#elif Q_MOC_OUTPUT_REVISION != 67

#error "This file was generated using the moc from 5.15.2. It"

#error "cannot be used with the include files from this version of Qt."

#error "(The moc has changed too much.)"

#endif

QT_BEGIN_MOC_NAMESPACE

QT_WARNING_PUSH

QT_WARNING_DISABLE_DEPRECATED

struct qt_meta_stringdata_XTest_t {

QByteArrayData data[28];

char stringdata0[206];

};

#define QT_MOC_LITERAL(idx, ofs, len) \

Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \

qptrdiff(offsetof(qt_meta_stringdata_XTest_t, stringdata0) + ofs \

- idx * sizeof(QByteArrayData)) \

)

static const qt_meta_stringdata_XTest_t qt_meta_stringdata_XTest = {

{

QT_MOC_LITERAL(0, 0, 5), // "XTest"

QT_MOC_LITERAL(1, 6, 6), // "author"

QT_MOC_LITERAL(2, 13, 22), // "Sabrina Schweinsteiger"

QT_MOC_LITERAL(3, 36, 4), // "sig1"

QT_MOC_LITERAL(4, 41, 0), // ""

QT_MOC_LITERAL(5, 42, 2), // "p4"

QT_MOC_LITERAL(6, 45, 14), // "sigAutoStartup"

QT_MOC_LITERAL(7, 60, 5), // "slot1"

QT_MOC_LITERAL(8, 66, 7), // "double*"

QT_MOC_LITERAL(9, 74, 2), // "p1"

QT_MOC_LITERAL(10, 77, 5), // "slot2"

QT_MOC_LITERAL(11, 83, 4), // "int*"

QT_MOC_LITERAL(12, 88, 2), // "p2"

QT_MOC_LITERAL(13, 91, 5), // "slot3"

QT_MOC_LITERAL(14, 97, 5), // "char*"

QT_MOC_LITERAL(15, 103, 2), // "p3"

QT_MOC_LITERAL(16, 106, 11), // "autoStartup"

QT_MOC_LITERAL(17, 118, 8), // "Priority"

QT_MOC_LITERAL(18, 127, 4), // "High"

QT_MOC_LITERAL(19, 132, 3), // "Low"

QT_MOC_LITERAL(20, 136, 8), // "VeryHigh"

QT_MOC_LITERAL(21, 145, 7), // "VeryLow"

QT_MOC_LITERAL(22, 153, 12), // "PriorityFlag"

QT_MOC_LITERAL(23, 166, 5), // "High1"

QT_MOC_LITERAL(24, 172, 4), // "Low1"

QT_MOC_LITERAL(25, 177, 9), // "VeryHigh1"

QT_MOC_LITERAL(26, 187, 8), // "VeryLow1"

QT_MOC_LITERAL(27, 196, 9) // "Alignment"

},

"XTest\0author\0Sabrina Schweinsteiger\0"

"sig1\0\0p4\0sigAutoStartup\0slot1\0double*\0"

"p1\0slot2\0int*\0p2\0slot3\0char*\0p3\0"

"autoStartup\0Priority\0High\0Low\0VeryHigh\0"

"VeryLow\0PriorityFlag\0High1\0Low1\0"

"VeryHigh1\0VeryLow1\0Alignment"

};

#undef QT_MOC_LITERAL

static const uint qt_meta_data_XTest[] = {

// content:

8, // revision

0, // classname

1, 14, // classinfo

5, 16, // methods

1, 59, // properties

3, 63, // enums/sets

0, 0, // constructors

0, // flags

2, // signalCount

// classinfo: key, value

1, 2,

// signals: name, argc, parameters, tag, flags

3, 1, 46, 4, 0x06 /* Public */,

6, 0, 49, 4, 0x06 /* Public */,

// slots: name, argc, parameters, tag, flags

7, 1, 50, 4, 0x0a /* Public */,

10, 1, 53, 4, 0x0a /* Public */,

13, 1, 56, 4, 0x8a /* Public | MethodRevisioned */,

// signals: revision

0,

0,

// slots: revision

0,

0,

1,

// signals: parameters

QMetaType::Void, QMetaType::VoidStar, 5,

QMetaType::Void,

// slots: parameters

QMetaType::Void, 0x80000000 | 8, 9,

QMetaType::Void, 0x80000000 | 11, 12,

QMetaType::Void, 0x80000000 | 14, 15,

// properties: name, type, flags

16, QMetaType::Bool, 0x00495103,

// properties: notify_signal_id

1,

// enums: name, alias, flags, count, data

17, 17, 0x0, 4, 78,

22, 22, 0x1, 4, 86,

27, 22, 0x1, 4, 94,

// enum data: key, value

18, uint(XTest::High),

19, uint(XTest::Low),

20, uint(XTest::VeryHigh),

21, uint(XTest::VeryLow),

23, uint(XTest::High1),

24, uint(XTest::Low1),

25, uint(XTest::VeryHigh1),

26, uint(XTest::VeryLow1),

23, uint(XTest::High1),

24, uint(XTest::Low1),

25, uint(XTest::VeryHigh1),

26, uint(XTest::VeryLow1),

0 // eod

};

void XTest::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)

{

if (_c == QMetaObject::InvokeMetaMethod) {

auto *_t = static_cast<XTest *>(_o);

Q_UNUSED(_t)

switch (_id) {

case 0: _t->sig1((*reinterpret_cast< void*(*)>(_a[1]))); break;

case 1: _t->sigAutoStartup(); break;

case 2: _t->slot1((*reinterpret_cast< double*(*)>(_a[1]))); break;

case 3: _t->slot2((*reinterpret_cast< int*(*)>(_a[1]))); break;

case 4: _t->slot3((*reinterpret_cast< char*(*)>(_a[1]))); break;

default: ;

}

} else if (_c == QMetaObject::IndexOfMethod) {

int *result = reinterpret_cast<int *>(_a[0]);

{

using _t = void (XTest::*)(void * );

if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&XTest::sig1)) {

*result = 0;

return;

}

}

{

using _t = void (XTest::*)();

if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&XTest::sigAutoStartup)) {

*result = 1;

return;

}

}

}

#ifndef QT_NO_PROPERTIES

else if (_c == QMetaObject::ReadProperty) {

auto *_t = static_cast<XTest *>(_o);

Q_UNUSED(_t)

void *_v = _a[0];

switch (_id) {

case 0: *reinterpret_cast< bool*>(_v) = _t->autoStartup(); break;

default: break;

}

} else if (_c == QMetaObject::WriteProperty) {

auto *_t = static_cast<XTest *>(_o);

Q_UNUSED(_t)

void *_v = _a[0];

switch (_id) {

case 0: _t->setAutoStartup(*reinterpret_cast< bool*>(_v)); break;

default: break;

}

} else if (_c == QMetaObject::ResetProperty) {

}

#endif // QT_NO_PROPERTIES

}

QT_INIT_METAOBJECT const QMetaObject XTest::staticMetaObject = { {

QMetaObject::SuperData::link<QObject::staticMetaObject>(),

qt_meta_stringdata_XTest.data,

qt_meta_data_XTest,

qt_static_metacall,

nullptr,

nullptr

} };

const QMetaObject *XTest::metaObject() const

{

return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;

}

void *XTest::qt_metacast(const char *_clname)

{

if (!_clname) return nullptr;

if (!strcmp(_clname, qt_meta_stringdata_XTest.stringdata0))

return static_cast<void*>(this);

return QObject::qt_metacast(_clname);

}

int XTest::qt_metacall(QMetaObject::Call _c, int _id, void **_a)

{

_id = QObject::qt_metacall(_c, _id, _a);

if (_id < 0)

return _id;

if (_c == QMetaObject::InvokeMetaMethod) {

if (_id < 5)

qt_static_metacall(this, _c, _id, _a);

_id -= 5;

} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {

if (_id < 5)

*reinterpret_cast<int*>(_a[0]) = -1;

_id -= 5;

}

#ifndef QT_NO_PROPERTIES

else if (_c == QMetaObject::ReadProperty || _c == QMetaObject::WriteProperty

|| _c == QMetaObject::ResetProperty || _c == QMetaObject::RegisterPropertyMetaType) {

qt_static_metacall(this, _c, _id, _a);

_id -= 1;

} else if (_c == QMetaObject::QueryPropertyDesignable) {

_id -= 1;

} else if (_c == QMetaObject::QueryPropertyScriptable) {

_id -= 1;

} else if (_c == QMetaObject::QueryPropertyStored) {

_id -= 1;

} else if (_c == QMetaObject::QueryPropertyEditable) {

_id -= 1;

} else if (_c == QMetaObject::QueryPropertyUser) {

_id -= 1;

}

#endif // QT_NO_PROPERTIES

return _id;

}

// SIGNAL 0

void XTest::sig1(void * _t1)

{

void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) };

QMetaObject::activate(this, &staticMetaObject, 0, _a);

}

// SIGNAL 1

void XTest::sigAutoStartup()

{

QMetaObject::activate(this, &staticMetaObject, 1, nullptr);

}

QT_WARNING_POP

QT_END_MOC_NAMESPACE

QMetaEnum::name

获取qt_meta_stringdata_XTest中对应位置的枚举类型名称

在test类中我们一个声明了3个枚举Priority、PriorityFlag、Alignment

上文对应的是红框部分

QMetaEnum::enumName

对于普通枚举作用和name一样,比如下图

PriorityFlag和Priority的name和enumName返回值都一样分别是字符串“PriorityFlag”和”Priority”。

但是对于Alignment则不同,name返回“Alignment”,enumName返回“PriorityFlag”。

QMetaEnum::keyCount

获取有多少个枚举值,Priority、PriorityFlag、Alignment对应的是:

QMetaEnum::isFlag

判断枚举值是否为标志

在moc对应的是

判断这个值是否为1,1就为标志

QMetaEnum::isScoped

判断是否为枚举类

在moc对应的是

判断这个值是否为2,2就为枚举类

QMetaEnum::key

获取枚举对应字符串

比如获取Alignment的High1字符串

QMetaEnum::value

获取枚举对应的值

比如获取Alignment::High1的值

QMetaEnum::scope

返回枚举所属类名称

QMetaEnum::keyToValue

获取字符串变量对应值

例如"VeryLow1"对应值是3

QMetaEnum::valueToKey

获取值对应枚举名称

QMetaEnum::keysToValue

字符串用“|”分割,获取枚举对应数值

QMetaEnum::valueToKeys

返回值对应的枚举名称

QMetaEnum::enclosingMetaObject

返回QMetaEnum所属的QMetaObject对象

QMetaEnum::isValid

内部调用QMetaEnum::name()函数,如果name为空则本函数返回false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/788124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

源码跟踪,案例详解Spark的分区规则

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 一、默认分区规则 1. 从集合中创建RDD - makeRDD   2. 读取外部存储系统创建RDD - textFile 二、指定分区规则 1. 从集合中创建RDD指定分区 - makeRDD   2. 读取外部存储系统创建RDD指定分…

基于Java+SpringBoot+vue前后端分离甘肃非物质文化网站设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

TCP/UDP的首部

TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度&#xff08;MSS&#xff09;选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节&#xff0c;加上选项部分最大可达60字节。 第一个4…

移动端商品详情页设计

效果图 代码如下 页面设计 <div class"container"><!--商品详情 start--><van-image class"goods-item-image" :src"goods.goodsHeadImg"></van-image><div class"goods-price">&#xffe5;<span&…

MySQL函数讲解(谓词、CASE)

目录 MySQL常见函数 字符串函数 进行字符串操作的函数 算术函数 进行数值计算的函数 日期函数 进行日期操作的函数 转换函数 进行数据类型和值转换的函数 流程函数 进行条件删选 聚合函数 进行数据聚合的函数 谓词 一般用于条件判断 什么是函数 函数指一段可以直接被…

web前端tips:js继承——原型链继承

原型链继承 原型链继承是 JavaScript 中实现继承的一种方式&#xff0c;它通过使用原型来实现对象之间的继承关系。 在 JavaScript 中&#xff0c;每个对象都有一个原型&#xff08;prototype&#xff09;&#xff0c;它是一个指向另一个对象的引用。当我们访问一个对象的属性…

Quartz线程调度源码分析

Quartz作为任务调度的组件&#xff0c;其中涉及到多种线程&#xff0c;主要分为主线程、调度线程和工作线程。 主线程&#xff1a;创建Quartz的调度工厂(SchedulerFactory)、调度器(Scheduler)、触发器(Trigger)、任务&#xff08;Job&#xff09;并启动调度器的线程。这里的主…

Pytest结合数据驱动-yaml

Pytest 结合数据驱动 YAML 数据驱动 什么是数据驱动&#xff1f; 数据驱动就是数据的改变从而驱动自动化测试的执行&#xff0c;最终引起测试结果的改变。简单来说&#xff0c;就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动&#xff0c;数据量大的…

Ceph社区上游正式合入openEuler原生支持,并通过CI持续验证

作为覆盖全场景应用、支持多样性算力的面向数字基础设施的开源操作系统&#xff0c;openEuler始终遵循“上游优先”的策略&#xff0c;帮助上游开源软件原生支持openEuler&#xff0c;让openEuler系操作系统的用户可以在开发、集成、使用这些开源软件或基于这些开源软件的产品和…

比较版本号(力扣)思维 JAVA

给你两个版本号 version1 和 version2 &#xff0c;请你比较它们。 版本号由一个或多个修订号组成&#xff0c;各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成&#xff0c;可能包含 前导零。每个版本号至少包含一个字符。修订号从左到右编号&#xff0c;下标从 0 开始…

vue3+ts+elementui-plus二次封装树形表格

复制粘贴即可&#xff1a; 一、定义table组件 <template><div classmain><div><el-table ref"multipleTableRef" :height"height" :default-expand-all"isExpend" :data"treeTableData"style"width: 100%…

IL汇编字符串连接

在此实现了一个基本的IL汇编程序&#xff1b; 了解MSIL汇编和IL汇编评估堆栈_bcbobo21cn的博客-CSDN博客 它用了下面两句来在屏幕输出字符串&#xff0c; ldstr "I am from the IL Assembly Language..." call void [mscorlib]System.Console::WriteLine (string) …

Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录

现象&#xff1a;Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录 问题&#xff1a;配置时路径写错 解决方法&#xff1a;改正路径 1.打开文件 gedit ~/.bashrc2.修改正确路径

Day 42算法记录| 动态规划 08

这里写目录标题 139. 单词拆分多重背包问题背包问题总结 139. 单词拆分 单词就是物品&#xff0c;字符串s就是背包 1.dp[0]背包啥也不要用装&#xff0c;true。 2. for循环&#xff0c;顺序很重要&#xff0c;所以先背包再物品 如果求组合数就是外层for循环遍历物品&#xff0…

UG\NX二次开发 遍历部件中所有表达式

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 遍历部件中所有表达式 效果: 代码: #include "me.hpp" #include <uf_defs.h> #include <NXOpen/NXException.hxx> #include <NXOpen/Session.hxx> #include <NXO…

java根据模板导出word

java根据模板导出word 日常开发中&#xff0c;常常会遇到各种各样的表格进行导出&#xff0c;比较好的办法就是提前弄好word模版&#xff0c;再通过遍历的方式进行导出文档 1、制作word模版 模版编写 内容替换 目标下面模版进行多页展示 将word转换成xml 将xml格式化 再将x…

FTP文件传输工具:简单、高效、实用的数据传输方式

在当今的信息化社会&#xff0c;数据已经成为各行各业的重要资产&#xff0c;而数据的传输和交换则是数据价值的体现。在很多场景中&#xff0c;企业需要传输或接收大文件&#xff0c;比如设计图纸、视频素材、软件开发包、数据库备份等。这些文件的大小通常在几百兆字节到几十…

版本控制泄露代码

在文章的开头我们首先得了解什么是版本控制 在实际的开发过程中&#xff0c;我们会用到两个工具来进行版本控制和代码托管&#xff0c;它们分别是git和svn。 而在CTF中我们主要面对的就是git或svn的版本控制泄露。 &#xff08;1&#xff09;在使用 SVN 管理本地代码过程中&am…

在拦截器中使用redis报错空指针

问题 当在拦截器中使用 redis 时&#xff0c;获取不到 RedisTemplate 对象 原因 拦截器在SpringContext初始化之前就执行了&#xff0c;即Bean初始化之前它就执行了&#xff0c;所以肯定是无法获取SpringIOC容器中的内容的 解决 提前实例化拦截器 在配置类里面先实例化拦截…

vue2项目迁移到vue3中的改动——vuex部分——基础积累2

pinia中文文档里面有关于vuex的部分&#xff1a; Pinia 最初是在 2019 年 11 月左右重新设计使用 Composition API 。从那时起&#xff0c;最初的原则仍然相同&#xff0c;但 Pinia 对 Vue 2 和 Vue 3 都有效&#xff0c;并且不需要您使用组合 API。 除了安装和 SSR 之外&…