本来打算把《Qt学习之路》作为一个类似教程的东西,所以就不打算把一些关系到源代码的内容放在那个系列之中啦。因此今天就先来看一个新的开始吧!这个系列估计不会进展很快,因为最近公司里面要做 flex 的项目演示,所以时间不是很多啦,并且源代码也不是那么容易看的。豆子也不是 C/C++ 出身,因此看起来也会有些麻烦。

《Qt源码剖析》作为一个独立的系列,大致就是对Qt的源代码进行分析。个人以为,分析的目的不在于你去写一个Qt出来,而是学习它的设计巧妙之处。正如我们去学习编译器的设计与实现,也并不是非要写一个编译器出来,而是学习到很多有用的算法和设计思路。这些才是更加需要注意的,也是比起写一个Qt更为现实的。

《Qt源码剖析》就不作为一个循序渐进的系列啦!因为源代码看起来也不可能会有一个循序渐进的过程,只能看多少说多少。但是豆子还是会努力把要说的东西表达清楚的!

当然,这么一个系列肯定少不了站在巨人的肩膀上去看问题。下面列出一些类似的系列:

同很多源代码剖析的文章一样,这个系列可能让初学者看不明白,不过有兴趣的童鞋也要去各处学习下啊~

下面我们要说的第一个问题是,哪里能找到Qt源代码。

不出意外的话,你安装的Qt应该是 LGPL 版本的。这个版本已经包括了完整的Qt源代码。下面打开你的Qt安装目录,你会看到2010.02.1这样的时间作为名称的目录,这就是Qt的版本号。4.6.1版对应的日期目录就是2010.02.1.进入这个目录,里面有一个 qt 目录,在这个 qt 目录中,你会找到 src 目录。这里面就是完整的 Qt 源代码。我们所要分析的代码,你就可以在这里找到啦!

下面我们从 QObject 这个最主要的类开始说起。

按照前面我们说过的路径,我们进入 qt/src 文件夹。你可能对这里的目录名时曾相识,因为几乎这里的所有文件夹名都对应着 Qt 的模块的名字:gui,network,multimedia等等。我们从最核心的 QtCore 开始。这个模块对应的是corelib文件夹。

首先我们要去寻找 QObject 这个类。之所以选择 QObject,一是因为它是 Qt 的核心类,另外一个很重要的原因是,QObject类是一个典型的Qt类,我们可以通过这个类学习到Qt的设计思路。

回忆一下我们编写 Qt 代码的时候,使用的语句是

  1. #include <QObject>

当我们进行 #include 语句时,预处理器寻找的是qt/include/QtCore这个目录。我们在这里面找到了 QObject 文件,而这里面只有一个语句:

  1. #include "qobject.h"

然后我们在同一个目录下又找到了这个 qobject.h,这里面也只有一句:

  1. #include "../../src/corelib/kernel/qobject.h"

而这个路径就是我们前面找到的那个 qobject 所在的位置!

因此我们回到在 corelib 里面,可以看到 kernel 文件夹。看到名字就应该知道,这就是Qt corelib 的核心。在这里面,我们可以找到有四个文件以 qobject 打头:

  • qobject.h:QObject 的类定义,这个就是 QObject 文件引用的文件,也就是我们使用的实际头文件;
  • qobject.cpp:QObject的实现代码;
  • qobjectdefs.h:这个文件中定义了很多用到的宏,并且定义了QMetaObject类,而这个类是实现signal- slot的基础;
  • qobject_p.h:对 QObject 的辅助数据类;

实际上我们还会看到另外两个文件:qobjectcleanuphandler.h 和 qobjectcleanuphandler.cpp。不过如果打开这两个文件就会发现,这里面定义的是一个QObjectCleanupHandler 类,而这个类是继承了 QObject 的,因此这只是一个普通的工具类,不在我们目前的讨论之列。因此我们可以认为,QOjbect 类是由4个文件共同实现的:qobject.h,qobject.cpp,qobjectdefs.h和qobject_p.h。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/322343

Qt核心剖析: 寻找 QObject 的源代码的更多相关文章

  1. Qt核心剖析:信息隐藏

    原文 http://devbean.blog.51cto.com/448512/326686 (一) 如果你阅读了 Qt 的源代码,你会看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q.我们的Qt源码之旅就 ...

  2. Qt核心剖析: moc

    前面我们说过,Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”.这里我们从Qt新增加的关键字就可以看出来:signals.slots 或者 emit.所以有人会觉得 Qt 的 ...

  3. Qt核心剖析:信息隐藏(三篇)

    http://devbean.blog.51cto.com/448512/335550 http://devbean.blog.51cto.com/448512/325581 http://devbe ...

  4. QT核心编程之调试技术 (g)

    Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(Data Display Debugger)是使用gdb调试工具的图形工具,它安装在Linux操作系统中,使用方法可参考D ...

  5. Qt核心机制与原理

    转:  https://blog.csdn.net/light_in_dark/article/details/64125085 ★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★ ...

  6. Qt核心机制和原理

    转:http://blog.csdn.net/light_in_dark/article/details/64125085 ★了解Qt和C++的关系 ★掌握Qt的信号/槽机制的原理和使用方法 ★了解Q ...

  7. QT核心编程之Qt线程 (c)

    QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...

  8. Qt写的截图软件包含源代码和可执行程序

    http://blog.yundiantech.com/?log=blog&id=14 Qt写的截图软件包含源代码和可执行程序 http://download.csdn.net/downloa ...

  9. 剖析Qt的事件机制原理(源代码级别)

    在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使Qt程序进入消息循环.下面我们就到exec()函数内部,来看一下他的实现原理.Let's go ...

随机推荐

  1. DevExpress ASP.NET 使用经验谈(7)-ASPxTreeList控件使用

    这一节,将介绍ASPxTreeList控件的使用,首先,我们增加一个标准地址库表AddressGB, 建表语句如下: CREATE TABLE [dbo].[AddressGB]( [Code] [v ...

  2. 找出N^N的最左边的一位数和最后边的一位数

    问题:找出N^N的最左边的一位数和最右边的一个数,N(1<=N<=1,000,000,000). 找最右边一位: 分析:其实找左右边的一位数还挺简单的,快速幂每次都只取结果的最后一位参加下 ...

  3. pygame初步(一)绘制一个运动的矩形

    <More Python Programming for the Absolute Beginner>一书中的第二章练习3(P33) 使用Python的Pygame库 import sys ...

  4. CSS3 transform制作的漂亮的滚动式导航

    模拟这个做的 不过实现的没有别人那么好 http://www.creativetier.com/products/modern-menu-3/vertical.html 关于transform  看这 ...

  5. Maven Jrebel 多模块热部署方案

    近期在构建maven多模块项目时,发现web module依赖的其它模块,每次都要clean install成一个jar包,然后运行web module才能加载. 本生jrebel是配置在了web m ...

  6. cocos2dx进阶学习之屏幕适配

    背景 在学习cocos2dx时,我们在main函数中发现一句代码, #include "main.h" #include "AppDelegate.h" #in ...

  7. FMDB的基本应用

    FMDB简介 iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较频繁.于是,就出现了一系列将AQLite API进行封装的库,例如FMDB.PlausibleDa ...

  8. SQL 表连接,内联、外联、全连

    内连接,join 或 inner join 两个表中符合条件的集合 外连接,left join  或  right  join 以left左边或right右边的表为数据集合行,根据条件,另一侧没有的数 ...

  9. 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集

    Result学习笔记(三)带參数的结果集 第一部分:代码 //前端 <head> <meta http-equiv="Content-Type" content= ...

  10. AS3清空数组的四种方法

    第一种最简单的方法是: var arr:Array = ["a", "b", "c", "d", "e&quo ...