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

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

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

相关文章

有些能力,是工作中学不来的,看看这篇超过90%同行

俗话说:360行&#xff0c;行行转IT。 在就业形势压力巨大的今天&#xff0c;不仅仅是计算机专业的毕业生&#xff0c;很多其他专业的大学生都选择转行从事计算机行业。 尤其是软件测试行业&#xff0c;远远超出其他行业的薪水和广阔的就业前景&#xff0c;吸引了大批应届毕业…

QT DAY1

1.思维导体 2.作业 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug()<<this->size();qDebug()<<this->rect().size();qDebug()<<this->geometry().size();qDebug()<<this->frameGeometry().siz…

视频增强技术-对比度增强

在图像处理中&#xff0c;由于获取的图像质量不好&#xff0c;需要通过对比度增强来提升图片质量&#xff0c;主要解决的是由于图像灰度级范围较小造成的对比度较低的问题&#xff0c;作用是使图像的灰度级范围放大&#xff0c;从而让图像更加清晰。主要对比度增强方法包括线性…

macbook 软件iMovie for Mac(专业视频剪辑工具)中文版

iMovie mac中文版是一款针对Mac平台量身定做的视频编辑工具&#xff0c;软件凭借流线型设计和直观的编辑功能&#xff0c;可以让您感受前所未有的方式制作好莱坞风格的预告片和精美电影&#xff0c;并且还可以浏览视频资料库&#xff0c;快速共享挚爱瞬间&#xff0c;创建精美的…

DevOps自动化平台开发之 Shell脚本执行的封装

基础知识 基于如下技术栈开发DevOps平台 Spring Boot Shell Ansible Git Gitlab Docker K8S Vue 1、spring boot starter的封装使用 2、Shell脚本的编写 3、Ansible 脚本的编写 4、Docker 的使用与封装设计 本篇介绍如何使用Java封装Linux命令和Shell脚本的使用 将其设计成…

文件上传漏洞

什么是文件上传漏洞&#xff1f; 攻击者上传了一个可执行文件如木马&#xff0c;病毒&#xff0c;恶意脚本&#xff0c;WebShell等到服务器执行&#xff0c;并最终获得网站控制权限的高危漏洞。 webshell 非法用户可利用上传的恶意脚本文件控制整个网站&#xff0c;甚至控制服…

直线导轨的主要功能

直线导轨是一种常见的机械结构&#xff0c;用于工业机器人、数控机床和其他自动化装置中。它的作用是提供一个准确的直线运动轨道&#xff0c;使得设备能够在预定的路径上进行精确的移动。 直线导轨作为一种重要的机械基础件&#xff0c;在现代工业中得到了广泛的应用。它主要的…

min_free_kbytes

转自&#xff1a;技术分享 | MemAvailable 是怎么计算的-腾讯云开发者社区-腾讯云 背景 前两天安装 OceanBase 时遇到一个小问题&#xff1a; 很明显&#xff0c;安装OB时要求服务器可用内存至少 8G&#xff0c;不达标就无法安装。为了凑这3台10G内存的服务器我已经费了不少劲…

Yunfly 一款高效、性能优异的node.js企业级web框架

介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一…

【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)

探究Redis服务启动的过程机制的技术原理和流程分析的指南&#xff08;集群功能分析&#xff09; Redis集群的出现背景提升性能扩展性 Redis集群概述Redis Cluster特性分布Redis Cluster的Failover机制Redis集群节点宕机集群如何判断节点是否挂掉集群进入失败状态的必要条件 Fai…

jmeter随记2:压测

jmeter随记1:压测 简述一、压测步骤二、观察cpu和内存占用情况三、查看磁盘占用情况 简述 关于压测&#xff0c;jmeter更直观的作用是用来编写压测脚本【请求和压测策略】&#xff0c;然后在linux服务器上执行&#xff0c;也可以在本地执行&#xff0c;压测执行脚本在启动jmet…

Linux:入门学习知识及常见指令

文章目录 入门介绍操作系统的概念Linux机器的使用Linux上的指令 对文件知识的补充文件的定义和一些含义文件和目录的存储绝对路径和相对路径 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令rm指令man指令cp指令mv指令cat指令more指令echo指令输出重定向 less指令find指令grep…

5、joern安装

文章目录 一、安装环境二、安装步骤1、joern地址2、安装中可能出现的问题 一、安装环境 1. java 8   2. gradle 2.0.0(按照官网步骤安装)   3. Graphviz (sudo apt install graphviz-dev)   4. python > 3.5 二、安装步骤 1、joern地址 joern地址 2、安装中可能出…

Docker配置阿里云容器镜像加速

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

白话机器学习笔记(三)评估已建立的模型

模型评估 在进行回归和分类时&#xff0c;为了进行预测&#xff0c;我们定义了函数 f θ ( x ) f_\theta(x) fθ​(x)&#xff0c;然后根据训练数据求出了函数的参数 θ \theta θ。 如何预测函数 f θ ( x ) f_\theta(x) fθ​(x)的精度&#xff1f;看它能否很好的拟合训练数…

【玩转Linux】标准io缓冲区的操作

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

[Golang] Viper原理以及详细使用案例

文章目录 什么是 Viper&#xff1f;基础配置引入依赖&#xff1a;动态监听原理分析&#xff1a;监听原理分析 Config.yaml文件配置Viper文件配置 什么是 Viper&#xff1f; 介绍&#xff1a;用于处理配置文件中解析和读取配置文件 优点&#xff1a;支持多种配置格式&#xff0…

新老联手,火花四溅?大众汽车与小鹏汽车达成长期合作框架协议

7 月 26 日资讯&#xff0c;大众汽车宣布与小鹏汽车达成长期合作框架协议&#xff0c;并在官网中正式宣布&#xff0c;大众是老牌油车领军代表&#xff0c;小鹏则是新势力中的佼佼者&#xff0c;新老强强联手&#xff0c;又会碰撞出怎样的火花呢&#xff1f; 现阶段大众计划与…

Postman学习之常用断言

什么是断言&#xff1f; 断言——就是结果中的特定属性或值与预期做对比&#xff0c;如果一致&#xff0c;则用例通过&#xff0c;如果不一致&#xff0c;断言失败&#xff0c;用例失败。断言&#xff0c;是一个完整测试用例所不可或缺的一部分&#xff0c;没有断言的测试用例…

leetcode每日一练-第98题- 验证二叉搜索树

一、思路 因为要验证多个节点是否是二叉搜索树,因此使用递归 二、解题方法 设计一个递归函数 helper(root, lower, upper) 来递归判断&#xff0c;函数表示考虑以 root 为根的子树&#xff0c;判断子树中所有节点的值是否都在 (l,r)的范围内&#xff08;注意是开区间&#x…