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

类定义:

成员变量就只有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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言非常道 6.4习题解答

关于 #include “stdarg.h” 相关知识小结&#xff1a; 函数&#xff1a;tppedef va_list char * ; va_list al; va_start(al, fmt) 使 al 指向变参函数中最后一个已知参数&#xff08;从右往左数的第一个已知参数&#xff09; va_arg(两个参数&#xff09;&#xff0c;第一个…

SpringBoot中配置文件的加载

springboot 启动会扫描一下位置的application.properties或者application.yml文件作为springboot的默认配置文件 file:./config/(项目根目录config文件夹下的配置文件) file:./(项目根目录下的配置文件) classpath:/config/(resources目录config文件下的配置文件) classpat…

【Android】Ubuntu20.04编译Android 13并用模拟器运行

前言 一直好奇Android系统是怎么定制的&#xff0c;直到亲自走一遍Android系统编译流程才发现并没想象的复杂。 这就跟app开发一样&#xff0c;Google官方其实都提供了平台、文档、IDE及一些工具&#xff0c;咱们只要按照官方提供的指南来操作就行了。 如果Android没有提供这…

中文输入法开发-关键代码

续上篇介绍了嵌入式Linux下中文输入法&#xff0c; 嵌入式Linux下开发中文输入法_嵌入式输入法_小刚学長的博客-CSDN博客 本篇继续介绍核心关键功能 展现效果图如下&#xff1a; 1、如何跟应用关联起来&#xff0c;比如说&#xff0c;希望当LineEdit 输入状态激活后&#xff0…

一文看懂FIFO!

什么是FIFO&#xff1f; FIFO: First in, First out 代表先进的数据先出 &#xff0c;后进的数据后出。 为什么需要FIFO&#xff1f; FIFO存储器是系统的缓冲环节&#xff0c;如果没有FIFO存储器&#xff0c;整个系统就不可能正常工作。 FIFO的功能可以概括为 &#xff0…

Python Flask构建微信小程序订餐系统 (十二)

🔥 创建切换商品分类状态的JS文件 🔥 ; var food_act_ops={init:function(){this.eventBind();},eventBind:function(){//表示作用域var that = this;$(".wrap_search select[name=status]").change(function(){$(".wrap_search").submit();});$(&qu…

java根据模板导出word

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

HCIP——OSPF基础

OSPF基础 一、OSPF基础二、OSPF的区域划分三、OSPF的数据包hello包数据库描述包DBD包链路状态请求包LSR包链路状态更新包LSU包链路状态确认包LSAck包 四、OSPF的状态机五、OSPF的工作过程六、链路状态型的路由生成过程七、条件匹配五、OSPF数据包头部八、OSPF的接口网络类型 一…

STC12C5A系列单片机内部 EEPROM 的应用

参考范例程序。 eeprom.c #include "eeprom.h"/*---------------------------- Disable ISP/IAP/EEPROM function Make MCU in a safe state ----------------------------*/ void IapIdle() {IAP_CONTR 0; //Close IAP functionIAP_CMD 0; …

ubuntu docker离线安装docker(.deb包方式)(成功)(附卸载方法)

参考文章&#xff1a;Install Docker Engine on Ubuntu 文章目录 安装步骤下载安装包拷贝到目标主机并执行安装命令 验证拉取运行容器测试build dockerfile测试持久运行容器测试主机重启后&#xff0c;docker各服务是否正常自启 卸载方法附&#xff1a;各安装包作用说明&#x…

静态路由小实验

文章目录 一、实验要求及拓扑图二、实验步骤三、思考题 一、实验要求及拓扑图 二、实验步骤 1、创建VLAN&#xff0c;将端口划入vlan 在交换机S3、S4上创建VLAN10、20 Switch(config)#vl 10 Switch(config-vlan)#vl 20 S3(config)#int f0/3 S3(config-if)#switchport access …

音视频——帧内预测

H264编码(帧内预测) 在帧内预测模式中&#xff0c;预测块P是基于已编码重建块和当前块形成的。对亮度像素而言&#xff0c;P块用于44子块或者1616宏块的相关操作。44亮度子块有9种可选预测模式&#xff0c;独立预测每一个44亮度子块&#xff0c;适用于带有大量细节的图像编码&…

uniapp 之 微信小程序、支付宝小程序 对于自定义导航栏的不同

目录 前言 微信小程序 代码 支付宝小程序 首页配置文件 二级菜单页面 配置 总结 不同 相同 前言 小程序都是 uni-app 写的 不是原生 微信小程序 代码 pages.json文件中配置 重点&#xff1a; "navigationStyle": "custom", // 导航栏样式…

MAC 推送证书不受信任

配置推送证书的时候&#xff0c;一打开就变成不受信任&#xff0c;搜了很多解决版本。 由于苹果修改相关规定&#xff0c;推送证书 打开Apple PKI - Apple 下载AppleWWDRCA文件&#xff0c;选择G4,双击安装之后&#xff0c;证书已经变为受信任。 AppleWWDRCA(Apple Worldwid…

代码随想录day12 | [前、中、后、层]二叉树的遍历迭代法和递归法

文章目录 一、前后中序递归法二、前后序迭代法三、中序遍历迭代法四、层序遍历 递归三部曲&#xff1a; 1️⃣ 第一步确定递归函数的返回值和参数 2️⃣第二步确定递归的终止条件 3️⃣第三步确定单层递归处理的逻辑 一、前后中序递归法 前序遍历二叉树 class Solution { pr…

关于应用在Google Play的元数据优化

应用标题中的关键词权重最大&#xff0c;其次是简短描述中的关键词&#xff0c;最后是长描述关键词&#xff0c;了解这些就能够很好的提高应用的可见度&#xff0c;下载量和整体成功率。 1&#xff0c;标题。 Google Play最多允许标题容纳30个字符&#xff0c;关键词的频率和密…

ARP协议(地址解析协议)

文章目录 ARP协议&#xff08;地址解析协议&#xff09;MAC地址ARP协议ARP具体实现同一链路不同链路 ARP 缓存缓存查询 APR请求/响应报文 ARP协议&#xff08;地址解析协议&#xff09; MAC地址 MAC 地址的全称是 Media Access Control Address&#xff0c;即媒体访问控制地址…

flask框架的请求处理逻辑

Django 和 Flask 是 Python 的两个非常流行的 Web 框架&#xff0c;它们对 HTTP 请求的处理方式有一些区别。 在 Django 中&#xff0c;当你的应用接收到一个 HTTP 请求时&#xff0c;Django 会将请求封装为一个 HttpRequest 对象&#xff0c;然后通过视图函数的参数传递这个对…

Kubernetes_核心组件_kubelet_kubelet服务全解析(二)

文章目录 前言kubelet 架构kubelet 职责Node管理(节点管理)Pod管理 kubelet管理Podkubelet如何管理当前节点上所有Podkubelet三个端口kubelet获取Pod清单kubelet通过CRI接口管理Pod以及里面的容器 PodWorker的工作细节PodWorker的工作细节PLEG组件PLEG报错 kubelet创建并启动Po…

kafka权威指南学习以及kafka生产配置

0、kafka常用命令 Kafka是一个分布式流处理平台&#xff0c;它具有高度可扩展性和容错性。以下是Kafka最新版本中常用的一些命令&#xff1a; 创建一个主题&#xff08;topic&#xff09;&#xff1a; bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replic…