Qt宏Q_OBJECT展开记录
c++中的宏
#define A 3.14
展开后把A替换为B
#define A(a) #a
展开后用a的字符串替换A(a)
#define A(a) a##B
展开后把a和B的字符串连接起来后替换A(a)
#include "common/common.h"
#define PI 3.14
#define PIPrivate 3.1415
#define foo(arg) #arg
#define bar(arg) arg##Private
int main(int argc, char *argv[]) {
DApplication::loadDXcbPlugin();
DApplication app(argc, argv);
Dtk::Util::DLogManager::registerConsoleAppender();
Dtk::Util::DLogManager::registerFileAppender();
qDebug()<<PI<<foo(PI)<<bar(PI)<<foo(bar(PI));
return 0;
}
源码地址:GitHub
在Qt中,用了不少的宏。最常见的就是Q_OBJECT
Q_OBJECT
展开的最终效果如下
public:
template<typename ThisObject>
inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const {
int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument);
i = i + 1;
}
_Pragma(GCC diagnostic push)
static const QMetaObject staticMetaObject;
virtual const QMetaObject *metaObject() const;
virtual void *qt_metacast(const char *);
virtual int qt_metacall(QMetaObject::Call, int, void **);
static inline QString tr(const char *s, const char *c = Q_NULLPTR, int n = -1) {
return staticMetaObject.tr(s, c, n);
}
static inline QString trUtf8(const char *s, const char *c = Q_NULLPTR, int n = -1) {
return staticMetaObject.tr(s, c, n);
}
private:
__attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
_Pragma(GCC diagnostic pop)
struct QPrivateSignal {};
下面做一步步展开Q_OBJECT
展开后如下,又有不少的宏
public:
Q_OBJECT_CHECK
QT_WARNING_PUSH
Q_OBJECT_NO_OVERRIDE_WARNING
static const QMetaObject staticMetaObject;
virtual const QMetaObject *metaObject() const;
virtual void *qt_metacast(const char *);
virtual int qt_metacall(QMetaObject::Call, int, void **);
QT_TR_FUNCTIONS
private:
Q_OBJECT_NO_ATTRIBUTES_WARNING
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
QT_WARNING_POP
struct QPrivateSignal {};
QT_ANNOTATE_CLASS(qt_qobject, "")
Q_OBJECT_CHECK
展开如下,宏越来越多了。
template<typename ThisObject>
inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const {
int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument);
i = i + 1;
}
QT_WARNING_PUSH
和QT_WARNING_POP
展开
#define QT_WARNING_PUSH QT_DO_PRAGMA(GCC diagnostic push)
#define QT_WARNING_POP QT_DO_PRAGMA(GCC diagnostic pop)
QT_DO_PRAGMA
展开
#define QT_DO_PRAGMA(text) _Pragma(#text)
又来了新的宏_Pragma
,参考2.1.3 _Pragma操作符,就是告诉编译器GCC diagnostic push
Q_OBJECT_NO_OVERRIDE_WARNING
展开
#if defined(Q_CC_CLANG) && Q_CC_CLANG >= 306
# define Q_OBJECT_NO_OVERRIDE_WARNING QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override")
#else
# define Q_OBJECT_NO_OVERRIDE_WARNING
#endif
QT_TR_FUNCTIONS
展开,QT_DEPRECATED
展开为空
static inline QString tr(const char *s, const char *c = Q_NULLPTR, int n = -1) {
return staticMetaObject.tr(s, c, n);
}
QT_DEPRECATED static inline QString
trUtf8(const char *s, const char *c = Q_NULLPTR, int n = -1) {
return staticMetaObject.tr(s, c, n);
}
Q_OBJECT_NO_ATTRIBUTES_WARNING
展开,QT_WARNING_DISABLE_GCC
展开为空
#define Q_OBJECT_NO_ATTRIBUTES_WARNING QT_WARNING_DISABLE_GCC("-Wattributes")
Q_DECL_HIDDEN_STATIC_METACALL
展开,出现了__attribute__
黑魔法,参考ATTRIBUTE 你知多少?
#define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN
#define Q_DECL_HIDDEN __attribute__((visibility("hidden")))
QT_ANNOTATE_CLASS
展开为空
#define QT_ANNOTATE_CLASS(type, ...)
参考文章
2.1.3 _Pragma操作符
ATTRIBUTE 你知多少?
源码地址:GitHub
http://qtdream.com:1111/topic/988/qt%E5%AE%8Fq_object%E5%B1%95%E5%BC%80%E8%AE%B0%E5%BD%95/2
Qt宏Q_OBJECT展开记录的更多相关文章
- QT宏 Q_OBJECT,explicit, QHostAddress, quint, emit
QT相關 一. 參考: 1.宏Q_OBJECT 二. explicit struct constrcution 三. QHostAddress Detailed Description: The QH ...
- C\C++语言中的宏多重展开和递归展开
宏定义中的#,## 1. 宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 2.记号粘贴操作符(token paste operator): ## “## ...
- Qt开发的应用记录读取用户习惯设置的方法
Qt开发的应用记录读取用户习惯设置的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/w ...
- Qt编写软件运行时间记录(开源)
在早期开发的软件中,尤其是初学者入门者写的软件,软件运行久了,难免遇到意外崩溃的时候,可是大部分的运行设备可能在现场客户那,需要记住每一次从软件启动后到软件意外关闭前的运行时间,需要记录的信息包括:编 ...
- Qt 安装与配置记录
一 安装的时候得选一个Qt安装啊!!不要忘了展开这一项,而只安装Qt creator 展开之后会发现有很多版本,为了方便,选自带编译器mingw,就不需要麻烦的配置了 二 打开Qt creator 后 ...
- Qt 格式转换问题 记录(好多方法)
用Qt经常头痛于一些格式不能通用的问题 在此记录备用 1 (20120112)QString转为Char * QString *str; char *a; str="hello word ! ...
- [转载][QT][SQL]sql学习记录6_sqlite Autoincrement(自动递增)
转载自:定义以及示例请见 : http://www.runoob.com/sqlite/sqlite-autoincrement.html SQLite Autoincrement(自动递增) SQL ...
- [转载][QT][SQL]sql学习记录5_sqlite视图(View)
转载自:http://www.runoob.com/sqlite/sqlite-view.html SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLi ...
- [转载][QT][SQL]sql学习记录4_sqlite约束
转载自:定义以及示例请见 : http://www.runoob.com/sqlite/sqlite-constraints.html SQLite 约束 约束是在表的数据列上强制执行的规则.这些是用 ...
随机推荐
- 【转载】用纯粹的C++编写COM组件
原文:http://blog.csdn.net/ghj1976/article/details/3441 下载本文代码 本文提供一个完全用C++实现的进程内(DLL)COM服务器,不要ATL或MFC提 ...
- 2069: [POI2004]ZAW
2069: [POI2004]ZAW 链接 题意: 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. n≤5000,m≤10 ...
- Linux 安装Nginx(使用Mac远程访问)
阅读本文需要一定的Linux基础 一 Nginx简介 nginx是用c语言编写的一款高性能的http服务器|反向代理服务器|电子邮件(IMAP/POP3)代理服务器 由俄罗斯的程序设计师Igor Sy ...
- 【LeetCode算法题库】Day5:Roman to Integer & Longest Common Prefix & 3Sum
[Q13] Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Valu ...
- windows上的mysql配置过程
个人电脑的mysql配置,记录下来留作备忘 1. 首先去官网下载最新的mysql安装包,我下的是5.7.25,地址是 https://dev.mysql.com/downloads/windows/ ...
- Netty源码分析第2章(NioEventLoop)---->第5节: 优化selector
Netty源码分析第二章: NioEventLoop 第五节: 优化selector 在剖析selector轮询之前, 我们先讲解一下selector的创建过程 回顾之前的小节, 在创建NioEv ...
- 安装GNU Radio及相关常用SDR软件的最简单方法
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...
- 小刘的深度学习---CNN
前言: 前段时间我在树莓派上通过KNN,SVM等机器学习的算法实现了门派识别的项目,所用到的数据集是经典的MNIST.可能是因为手写数字与印刷体存在一些区别,识别率并是很不高.基于这样的情况,我打算在 ...
- JavaScript学习(2)call&apply&bind&eval用法
javascript学习(2)call&apply&bind&eval用法 在javascript中存在这样几种特别有用的函数,能方便我们实现各种奇技淫巧.其中,call.bi ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)的解决
在用爬虫爬取网络小说的时候出现该问题. 估计是字符格式转换格式的错误. 暂时无法解决,搜索了其他博主的解决方案. 以下两个方案靠谱: <一>适用于全篇 import sys default ...