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 对象,所以我们可以进行转换:

QWidget*widget = qobject_cast<QWidget*>(obj);

从 QObject 转为 QWidget是成功的,因为对象本质就是一个MyWidget,它是QWidget的一个子类。所以我们知道obj是一个MyWidget,我们也可以把它转换为MyWidget *。

    MyWidget *myWidget = qobject_cast<MyWidget *>(obj);

可以成功的进行转换,因为qobject_cast()不区分Qt内置类型和自定义类型。

QLabel*label = qobject_cast<QLabel*>(obj);
    // label is 0

转换为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的更多相关文章

  1. 6、Qt Meta Object system 学习

    原文地址:http://blog.csdn.net/ilvu999/article/details/8049908 使用 meta object system 继承自 QOject 类定义中添加 Q_ ...

  2. Qt Meta Object system 学习

    原文地址:http://blog.csdn.net/ilvu999/article/details/8049908 使用 meta object system 继承自 QOject 类定义中添加 Q_ ...

  3. Qt Meta Object System-元对象系统

    研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 元对象系统 ...

  4. 启用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 ...

  5. 深入了解Qt(二)之元对象系统(Meta-Object System)

    深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt Meta Object System-元对象系统这篇文章中,从底层实现的源码剖析了元对象 ...

  6. 词频统计_输入到文件_update

    /* 输入文件见337.in.txt 输出文件见338.out.txt */ #include <iostream> #include <cctype> #include &l ...

  7. Qt事件循环与状态机事件循环的思考

    写下这个给自己备忘,关于事件循环以及多线程方面的东西我还需要多多学习.首先我们都知道程序有一个主线程,在GUI程序中这个主线程也叫GUI线程,图形和绘图相关的函数都是由主线程来提供.主线程有个事件循环 ...

  8. Qt中连接到同一signal的多个slots的执行顺序问题(4.6以后按连接顺序执行)

    起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. Manual Qt的问题,当manual中有明确文字说明时,我们应该以Qt的 ...

  9. Inside Qt Series (全集)

    Inside Qt 系列 QObject这个 class 是 QT 对象模型的核心,绝大部分的 QT 类都是从这个类继承而来.这个模型的中心特征就是一个叫做信号和槽(signaland slot)的机 ...

  10. [转]bitcoin API reference (JSON-RPC)

    本文转自:https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Node.js API reference (JSON-RPC)     Co ...

随机推荐

  1. SQL Server验证的两种方式

    1.Windows身份验证:本机连接或者受信的局域网连接(一般在忘记管理员密码或者做系统配置的情况下使用). 2.SQLServer验证:使用用户名.密码验证(推荐使用). 启用方法:以Windows ...

  2. C# Best Practices - Define Fields Appropriately

    Backing Fields private string description; private int productId; Features A variable in a class Hol ...

  3. OC-nonatomic和atomic相关

    1.原子和非原子属性1.1>OC在定义属性时又nonatomic和atomic两种选择(1)atomic:原子属性,为setter方法加锁(默认就是atomic)(2)nonatomic:非原子 ...

  4. BZOJ 1627: [Usaco2007 Dec]穿越泥地( BFS )

    BFS... --------------------------------------------------------------------------------------- #incl ...

  5. Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)

    Qt有两种定时器,一种是QObject类的定时器,另一种是QTimer类的定时器.   (1)QObject类的定时器   QObject类提供了一个基本的定时器,通过函数startTimer()来启 ...

  6. 深入探究VC —— 资源编译器rc.exe(3)

    Windows应用程序中,图标.菜单.畏途.图标.工具条.对话框等是以资源的形式存在的.开发人员也可以自定义资源类型.如果一个程序使用了资源,那么它在构建时需要对资源进行编译.程序所使用的资源会在资源 ...

  7. VC之美化界面(内容覆盖十分全面,经典)

    界面美化 摘要本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理: 2. 熟悉Windows消息机制,熟悉MFC的消息映射和 ...

  8. 初遇Git与MarkDown 文件

    新年好! 昨晚熬夜在学Git,稍微会了一些命令. 推荐大家去try.github.io上学习,这是GitHub提供的网页,它在网页提供了一个“伪”模拟器,根据网页的提示学习命令.网页上说15分钟就能学 ...

  9. 史上最全然oophper php文件上传之文件类型相应表,ie,火狐各一份。

    ie 火狐 id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd appl ...

  10. Latex(一)公式自动编号与自动引用

    在进行latex引用时,有两种办法: 一,被动引用. 如有这样一段代码: $$ x^2+y^2= z^2.\eqno(1.1) $$ In this paper, we investigated (1 ...