`
Finder
  • 浏览: 27477 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Qt源码剖析:从 QObject 开始

    博客分类:
  • Qt
阅读更多

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

 

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

 

《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 代码的时候,使用的语句是

 

#include <QObject>

 

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

 

#include "qobject.h"

 

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

 

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

 

而这个路径已经指向了久违的 src 文件夹,这就是我们前面找到的那个 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。

0
2
分享到:
评论

相关推荐

    Qt源码分析之QObject

    Qt 源码分析之 QObject QObject 是 Qt 类体系的唯一基类,它是 Qt 各种功能的源头活水。因此,Qt 源码分析的第一节就放在这个 QObject 上。 首先,让我们来看一个简单的测试代码: ```c #include #include #...

    Qt 多线程采用继承QObject方式编写

    Qt提供了一种独特的方式来处理多线程,即通过继承`QObject`类来实现。这种方式既方便又安全,因为它允许我们在子线程中使用信号和槽机制,这是Qt的核心特性之一。 首先,理解`QObject`在多线程中的作用。`QObject`...

    QObject::moveToThread用例

    QObject调用moveToThread(QThread *targetThread)后, 运行targetThread.start(),此后QObject的事件将在targetThread中处理。 比如:QObject的槽函数,将在targetThread中处理。

    QT 利用继承Qobject实现多线程

    在QT中,通过继承`QObject`类并利用`moveToThread()`函数,我们可以方便地实现多线程操作,这对于处理耗时任务或避免阻塞主线程来说至关重要。下面我们将深入探讨如何使用这些技术以及`QMutex`来确保线程安全。 ...

    qt工厂模式例子qt简单工程模式源码

    1. Qt工厂模式源码 2. C++工厂模式源码 3. Qt工厂模式工程 4. Qt工厂模式例程 5. Qt工厂模式例子 6. 简单工厂模式 部分源码实例: // 奔驰工厂 class BenzFactory : public AFactory { public: ICar* CreateCar() {...

    inside QT(深入阅读QT源代码)

    ### 深入阅读QT源代码:QObject核心解析 #### 1. 引言 本文旨在探讨QT框架中核心组件`QObject`的内部实现机制及其重要性。`QObject`是QT对象模型的基础,几乎所有的QT类都直接或间接地继承自`QObject`。通过深入...

    Qt示例程序源码.rar_QT5_Qt 程序 源码_qt源码_源码 QT

    - **国际化与本地化**:Qt支持多语言,你可以使用QLocale和QTranslator进行应用的国际化。 5. **源码解析**: - 对于压缩包内的每个源码文件,你可以逐一研究其结构和逻辑,学习如何组织代码、如何定义信号和槽、...

    Qt-5.12.12源码

    例如,QObject类是所有Qt对象的基类,提供了信号与槽机制,这是Qt异步通信的关键。 2. **Gui模块**:提供图形用户界面元素,如窗口、按钮、文本框等,以及2D图形绘制功能。QPainter类是用于绘制图形的基本工具,而...

    Qt实战案例之利用QObject类实现定时器功能.zip

    在本实战案例中,我们将深入探讨如何在Qt框架下利用QObject类实现定时器功能。Qt是一个跨平台的应用程序开发框架,广泛应用于C++编程。它提供了丰富的类库,包括QObject,它是所有Qt对象的基类,支持信号与槽机制,...

    QT.rar_qt 源码

    6. **内存管理**:Qt是如何进行对象生命周期管理的,特别是智能指针的使用和QObject的子类化。 7. **模块化设计**:理解Qt如何通过模块化组织代码,以便于复用和扩展。 总之,深入学习Qt源码可以极大地提升你的C++...

    Qt分析QObject子类内部成员结构

    - **控制台方式**:通常涉及到的是对对象树的遍历和打印,利用`QObject::children()`获取子对象列表,然后逐个输出它们的信息,如名称、类型等。还可以使用`qDebug()`进行调试输出,以便了解对象的属性和状态。 - *...

    qtwebkit qobject与js交互

    在本文中,我们将深入探讨如何在QtWebKit框架下利用QObject与JavaScript进行交互。QtWebKit是一个强大的库,它允许Qt应用程序嵌入Web内容并与其进行互动。这个特定的示例程序展示了本地C++代码(通过QObject)如何与...

    Qt5学习:常见类继承关系 简明示意图.pdf

    首先,我们从Qt的核心模块开始,即QObject类。QObject是Qt中所有类的基类,它提供了对象间的信号与槽机制、属性系统、事件处理等核心功能。接下来,我们可以看到几个重要的派生类,分别是QCoreApplication、...

    qt通过类名动态创建对象

    在Qt框架中,动态创建对象是一项重要的编程技巧,它允许我们根据字符串形式的类名来实例化对应的对象。这样的功能在实现插件机制、运行时加载不同组件或处理未知类型对象时尤为有用。本篇文章将深入探讨如何在Qt中...

    qt 计时器 00:00:00形式

    1. **QTimer类**: Qt中的计时器功能主要由`QTimer`类提供,它是`QObject`的子类,可以发送信号来触发指定的槽函数。`QTimer`提供了单次触发和周期性触发两种模式。 2. **定时器类型**: 在Qt中,有两种类型的计时器...

    NOKIA_QT培训资料(中文版).pptx

    `QObject`类是Qt框架中的基石,它是几乎所有的Qt类和部件的基础。`QObject`包含了构建Qt应用程序至关重要的功能,如: 1. **事件系统**:`QObject`支持事件处理,使得对象能够响应各种类型的系统事件,如鼠标点击、...

    QtHttpServer例子

    1. **Qt**:Qt是一个跨平台的应用程序开发框架,广泛用于创建桌面、移动和嵌入式设备的图形用户界面应用。 2. **httpServer**:这指的是实现HTTP协议的服务器端部分,它负责接收客户端的HTTP请求并发送响应。 3. **...

    QT CheckBox复选框状态设置、信号绑定, setCheckState、checkState、setTristate

    你可以使用`QObject::connect()`来连接`CheckBox`的`stateChanged`信号到一个槽,以便在用户改变`CheckBox`状态时执行特定的操作。例如: ```cpp QObject::connect(checkBox, &QCheckBox::stateChanged, this, &...

    Qt4教程与源码 Qt 4 中文版

    ### 第一章:Qt入门 - **Qt架构概述**:了解Qt的基本结构,包括Qt库、QObjects、信号与槽机制。 - **安装与配置**:介绍如何在不同平台上安装Qt4开发环境,包括Qt Creator IDE。 - **第一个Qt程序**:通过编写一个...

Global site tag (gtag.js) - Google Analytics