The Meta-Object System
The Meta-Object System
Qt元对象系统为对象之间的交互提供了信号与槽机制,运行时信息和动态属性系统。
元对象系统基于三件事:
1. Qobject类作为所有要利用元对象系统的基类。
2. 在类的private段声明Q_OBJECT 宏,以可以使用元对象特性,例如动态属性,信号与槽。
3. 元对象编译器为Qobject子类提供了必要的代码以实现元对象特性。
Moc工具读取C++源文件。如果找到一个或多个类声明包含Q_OBJECT宏。它为每个类生成另外的一个包含元对象代码C++源文件。这些生成的源文件不仅仅包含到类的源文件中,而且类在编译和链接都用到。
另外为对象之间通信提供信号与槽机制,元对象代码提供了以下特性:
1. QObject::metaObject()返回类相关联的元对象。
2. QMetaObject::className()返回运行时类名,不需要用C++编译器的RTTI。
3. QObject::inherits() 返回一个对象是否是Qobject继承树的一个类的实例。
4. QObject::tr() 和 QObject::trUtf8() 转换一个字符串实现国际化。
5. QObject::setProperty() 和 QObject::property()通过名称动态设置和获取属性。
6. QMetaObject::newInstance() 创建类的一个实例。
在Qobject上使用动态类型转换qobject_cast()也是可以的。qobject_cast()与C++的dynamic_cast()相似,它的优势就是不需要C++的RTTI支持和可以跨越动态库边界。它尝试把参数转换为尖括号中指定的指针类型,如果对象是个正确的类型则返回非0的指针,否则返回0.
例如:我们假设MyWidget继承了QWidget,而且类中声明了 Q_OBJECT宏。
QObject*obj =newMyWidget;
obj变量,是QObject类型的指针。指向一个MyWidget 对象,所以我们可以进行转换:
从 QObject 转为 QWidget是成功的,因为对象本质就是一个MyWidget,它是QWidget的一个子类。所以我们知道obj是一个MyWidget,我们也可以把它转换为MyWidget *。
MyWidget *myWidget = qobject_cast<MyWidget *>(obj);
可以成功的进行转换,因为qobject_cast()不区分Qt内置类型和自定义类型。
转换为QLabel是失败的。指针被设置为0.这使得我们根据类型,处理对象运行时的不同类型。
if (QLabel *label = qobject_cast<QLabel*>(obj))
{
label->setText(tr("Ping"));
} elseif (QPushButton *button = qobject_cast<QPushButton*>(obj)) {
button->setText(tr("Pong!"));
}
也可以用QObject作为基类但是不包含Q_OBJECT 宏和元对象代码。如果不用Q_OBJECT 宏,信号与槽和这里描述的其他特性都不可用。从元对象系统的角度来看,不包含元代码的QObject子类等价于它最近的祖先类的元对象代码。比如,QMetaObject::className()将不会返回你实际的类名,而是该类的祖先类的名字。
所以,我们强烈建议在QObject所有子类中使用Q_OBJECT 宏,不管是否使用信号与槽机制和属性。
http://blog.csdn.net/hai200501019/article/details/9155987
The Meta-Object System的更多相关文章
- 6、Qt Meta Object system 学习
原文地址:http://blog.csdn.net/ilvu999/article/details/8049908 使用 meta object system 继承自 QOject 类定义中添加 Q_ ...
- Qt Meta Object system 学习
原文地址:http://blog.csdn.net/ilvu999/article/details/8049908 使用 meta object system 继承自 QOject 类定义中添加 Q_ ...
- Qt Meta Object System-元对象系统
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 元对象系统 ...
- 启用SQLite的Data Provider 运行WECOMPANYSITE时遇到ERROR CREATING CONTEXT 'SPRING.ROOT': ERROR THROWN BY A DEPENDENCY OF OBJECT 'SYSTEM.DATA.SQLITE'
从网上下载的源码WeCompanySite,运行时报错 Error creating context 'spring.root': Error thrown by a dependency of ob ...
- 深入了解Qt(二)之元对象系统(Meta-Object System)
深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt Meta Object System-元对象系统这篇文章中,从底层实现的源码剖析了元对象 ...
- 词频统计_输入到文件_update
/* 输入文件见337.in.txt 输出文件见338.out.txt */ #include <iostream> #include <cctype> #include &l ...
- Qt事件循环与状态机事件循环的思考
写下这个给自己备忘,关于事件循环以及多线程方面的东西我还需要多多学习.首先我们都知道程序有一个主线程,在GUI程序中这个主线程也叫GUI线程,图形和绘图相关的函数都是由主线程来提供.主线程有个事件循环 ...
- Qt中连接到同一signal的多个slots的执行顺序问题(4.6以后按连接顺序执行)
起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. Manual Qt的问题,当manual中有明确文字说明时,我们应该以Qt的 ...
- Inside Qt Series (全集)
Inside Qt 系列 QObject这个 class 是 QT 对象模型的核心,绝大部分的 QT 类都是从这个类继承而来.这个模型的中心特征就是一个叫做信号和槽(signaland slot)的机 ...
- [转]bitcoin API reference (JSON-RPC)
本文转自:https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Node.js API reference (JSON-RPC) Co ...
随机推荐
- javaweb学习路之三--websocket多人在线聊天
在之前的项目基础上,加入了一个聊天室的功能,为了界面好看 引入了AmazeUI和umeditor最终效果图如下: 源码在 https://github.com/Zering/MyWeb 目前练习都在这 ...
- 简单的前端js+ajax 购物车框架(入门篇)
其实,一直想把自己写的一些js给总结下,也许是能力有限不能把它完美结合起来.只能自己默默的看着哪些代码,无能为力. 今天在公司实在没有事做,突然就想到写下商城的购物车的前端框架,当然我这里只有购物车的 ...
- sql 时间和字符串 取到毫秒级
(select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')+(Select ri ...
- windows上运行npm Error: ENOENT, stat 'C:\Users\
node 中 npm报错 Error: ENOENT, stat C:\Users\Administrator\AppData\Roaming\npm 报错原因可能是修改了node的默认安装路径.于是 ...
- 如果让莎士比亚、海明威编写JavaScript代码
本文作者Angus Croll是Twitter工程师.JavaScript迷.文学迷,并且非常喜欢作家海明威.他在梦中"梦见"一些名人编写JavaScript代码,不同的作家呈现出 ...
- ansible变量
ansible变量 (部分内容摘自互联网,非官方,描述不一定正确) 变量种类: 内置变量facts: 自定义变量: 命令行传递的变量 roles传递的变量 主机变量 组变量 内置变量facts: 由远 ...
- python之列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 1,比如:要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...
- [Swust OJ 1023]--Escape(带点其他状态的BFS)
解题思路:http://acm.swust.edu.cn/problem/1023/ Time limit(ms): 5000 Memory limit(kb): 65535 Descript ...
- Visual C++ 6.0编程环境的使用
1.1 编制并运行程序的四部曲 (1)编辑(把程序代码输入,交给计算机). (2)编译(成目标程序文件.obj).编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟 ...
- iOS开发之SDWebImage详解
介绍 github地址: https://github.com/rs/SDWebImage 简介 一个异步图片下载及缓存的库 特性: 一个扩展UIImageView分类的库,支持加载网络图片并缓存图片 ...