Qt核心剖析: 寻找 QObject 的源代码

简介:

本来打算把《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。



本文转自 FinderCheng 51CTO博客,原文链接:http://blog.51cto.com/devbean/322343




相关文章
|
4月前
|
程序员
QT 官方QObject对象翻译要点(纯属个人翻译,不靠谱)
QT 官方QObject对象翻译要点(纯属个人翻译,不靠谱)
23 1
|
2月前
|
程序员 编译器 C++
【深入探究Qt内部架构】QObject、事件循环与Q_OBJECT宏的协同作用(一)
【深入探究Qt内部架构】QObject、事件循环与Q_OBJECT宏的协同作用
47 0
|
1月前
|
编译器
正点原子IMX6ULL-安装交叉编译器、编译tslib触摸屏库、编译arm环境qt源代码
正点原子IMX6ULL-安装交叉编译器、编译tslib触摸屏库、编译arm环境qt源代码
|
2月前
|
设计模式 开发框架 编译器
【深入探究Qt内部架构】QObject、事件循环与Q_OBJECT宏的协同作用(二)
【深入探究Qt内部架构】QObject、事件循环与Q_OBJECT宏的协同作用
38 0
第一次创建Qt程序,对里面源代码头文件解析,常用快捷键,Qt助手
第一次创建Qt程序,对里面源代码头文件解析,常用快捷键,Qt助手
第一次创建Qt程序,对里面源代码头文件解析,常用快捷键,Qt助手
|
C++ iOS开发 MacOS
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS2)
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS2)
821 0
Qt Creator使用clang-format实现源代码格式化排版(Windows/macOS2)
|
2月前
|
算法 编译器 Linux
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
【Qt4 部署】ARM系统上使用Qt 4 进行开发的QWS 等环境变量部署
25 0
|
2月前
|
网络协议 C++
C++ Qt开发:QTcpSocket网络通信组件
`QTcpSocket`和`QTcpServer`是Qt中用于实现基于TCP(Transmission Control Protocol)通信的两个关键类。TCP是一种面向连接的协议,它提供可靠的、双向的、面向字节流的通信。这两个类允许Qt应用程序在网络上建立客户端和服务器之间的连接。Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用`QTcpSocket`组件实现基于TCP的网络通信功能。
44 8
C++ Qt开发:QTcpSocket网络通信组件