原文地址:http://blog.163.com/net_worm/blog/static/1277024192010097430321/

在开始分析之前交代一下,一是分析的QT在Window平台实现(其它OS类似);二、分析的手段为看源码+单步跟踪。有时候会让编译器产生预编译后的输出(使用-E参数),便于观察;三、分析得QT版本为4.5.3

下面是QT经典的Hello world程序

 1 #include <qapplication.h>
2 #include <qpushbutton.h>
3 #include <qfont.h>
4
5 int main( int argc, char **argv )
6 {
7 QApplication a( argc, argv );
8 QPushButton quit( "Quit", 0 );
9 quit.resize( 75, 30 );
10 quit.setFont( QFont( "Times", 18, QFont::Bold ) );
11 QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );
12 quit.show();
13 return a.exec();
14 }

第一句声明了一个QApplication的对象,QApplication的类继承关系为:

1 QApplication : QCoreApplication : QObject

先观察QApplication的构造函数:

1 QApplication::QApplication(int &argc, char **argv)
2 : QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient))
3 { Q_D(QApplication); d->construct(); }

这里先后做了三件事:新生成一个QApplicationPrivate对象并传递给QCoreApplication;宏Q_D;调用d->construct()。

看Q_D的定义:

1 #define Q_D(Class) Class##Private * const d = d_func()

Q_D(QApplication);展开后是:

1 QApplicationPrivate * const d = d_func();

在附近正好看到Q_Q的定义:

1 #define Q_Q(Class) Class * const q = q_func()

由此看到在QT的程序里最好不要定义d、q这样的变量。

所以d->construct()调用的其实是

1 QApplicationPrivate::construct();

那么这个construct()干了什么事呢?

 1 void QApplicationPrivate::construct()
2 {
3 initResources(); // 初始化资源
4
5 qt_is_gui_used = (qt_appType != QApplication::Tty);
6 process_cmdline(); // 扫描分析命令行参数
7 // Must be called before initialize()
8 qt_init( this, qt_appType ); // 在initialize()之前必须执行的初始化,例如色彩、字体、键盘等
9 initialize();
10 eventDispatcher->startingUp();
11
12 }

其中eventDispatcher->startingUp();实际调用的是:QEventDispatcherWin32::startingUp(),主要是注册事件分发器。

回来看QCoreApplication的构造过程,把QApplicationPrivate对象传递给QOjbec,然后调用init()。

1 QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)
2 : QObject(p, 0)
3 {
4 init();
5 // note: it is the subclasses' job to call
6 // QCoreApplicationPrivate::eventDispatcher->startingUp();
7 }

我们先来看QCoreApplication::init()干了什么事呢?

 1 void QCoreApplication::init()
2 {
3 Q_D(QCoreApplication);
4
5 // Get the application name/instance if qWinMain() was not invoked
6 set_winapp_name(); // 设置应用程序的名字
7
8 Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
9 QCoreApplication::self = this;
10
11 QThread::initialize(); // 初始化线程
12
13 // use the event dispatcher created by the app programmer (if any)
14 if (!QCoreApplicationPrivate::eventDispatcher)
15 QCoreApplicationPrivate::eventDispatcher = d->threadData->eventDispatcher;
16 // otherwise we create one
17 if (!QCoreApplicationPrivate::eventDispatcher)
18 d->createEventDispatcher(); // 生成事件分发
19 Q_ASSERT(QCoreApplicationPrivate::eventDispatcher != 0);
20
21 if (!QCoreApplicationPrivate::eventDispatcher->parent())
22 QCoreApplicationPrivate::eventDispatcher->moveToThread(d->threadData->thread);
23
24 d->threadData->eventDispatcher = QCoreApplicationPrivate::eventDispatcher;
25
26 if (!coreappdata()->app_libpaths) {
27 // make sure that library paths is initialized
28 libraryPaths(); // 确认或设定DLL库的路径
29 } else {
30 d->appendApplicationPathToLibraryPaths();
31 }
32
33 qt_startup_hook(); // 目前是空函数
34 }

Object的构造又做了什么事情呢?

QObject::QObject(QObjectPrivate &dd, QObject *parent)     : d_ptr(&dd) 将QApplicationPrivate对象传递给d_ptr,这个d_ptr是什么呢?

我们看QObject的类定义,d_ptr是QObject中唯一的数据成员:

protected:     QObjectData *d_ptr; 至此,QApplication对象的初始基本分析完毕,除了很多初始化的动作之外,主要就是把QApplication和QApplicationPrivate关联起来.

转自:http://www.cnblogs.com/lfsblack/p/5278987.html

1、QT分析之QApplication的初始化的更多相关文章

  1. QT分析之QApplication的初始化

    原文地址:http://blog.163.com/net_worm/blog/static/1277024192010097430321/ 在开始分析之前交代一下,一是分析的QT在Window平台实现 ...

  2. 2、QT分析之QPushButton的初始化

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201001003326522/ 在简单的QT程序的第二行,声明了一个QPushButto ...

  3. QT分析之QPushButton的初始化

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201001003326522/ 在简单的QT程序的第二行,声明了一个QPushButto ...

  4. Qt事件分发机制源码分析之QApplication对象构建过程

    我们在新建一个Qt GUI项目时,main函数里会生成类似下面的代码: int main(int argc, char *argv[]) { QApplication application(argc ...

  5. 10、QT分析之WebKit

    该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...

  6. 3、QT分析之消息事件机制

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201001432028526/ 上回我们分析到QPushButton的初始化,知道了Wi ...

  7. 5、QT分析之网络编程

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...

  8. QT分析之WebKit

    该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...

  9. QT分析之网络编程

    原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...

随机推荐

  1. ios7新特性--1

    1.用户界面的扁平化 2.UIKit 动态行为支持 应用程序可以设置UIView 对象和其他对象(遵从UIDynamicItem 协议)的动态行为属性.遵从UIDynamicItem协议的对象被称为d ...

  2. 【Unity】3.3 用3ds Max 2015制作模型并将其导入到Unity

    分类:Unity.C#.VS2015 创建日期:2016-04-05 一.常用三维软件简介 由于游戏引擎本身的建模功能相对较弱,无论是专业性还是自由度都无法同专业的三维软件相比,所以大多数游戏中的模型 ...

  3. zabbix server 在配置客户端的时候 在zabbix server端的/etc/hosts文件的hostname 对应的ip这样可以更快的让server端发现agent端

    如下: # cat /etc/hosts 127.0.0.1 localhost.localdomain localhost.localdomain localhost4 localhost4.loc ...

  4. HTML5学习笔记(二十二):DOM

    DOM即文档对象模型(Document Object Model),其定义了访问和操作 HTML 文档的标准方法. DOM 将 HTML 文档表达为树结构,如下: 通过DOM,开发人员可以动态的添加. ...

  5. Java map双括号初始化方式的问题

    关于Java双括号的初始化凡是确实很方便,特别是在常量文件中,无可替代.如下所示: Map map = new HashMap() { { put("Name", "Un ...

  6. 18、利用 Windows Device Portal 获取用户闪退 dump

    当 uwp在用户的电脑上发生了闪退,并且由于用户距离较远,不便于使用 VS进行远程 Debug,更不可能让用户安装 Visual Studio进行分析的时候,在用户的电脑上收集 dump 是一种有效的 ...

  7. 【流媒体】UPnP的工作过程

    UPnP简介 通用即插即用(英语:Universal Plug and Play,简称UPnP)是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议. 该协议的目标是使家庭网络(数据共 ...

  8. 线上服务CPU100%问题快速定位实战

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...

  9. LeetCode: String to Integer (atoi) 解题报告

    String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully consider ...

  10. 【神经网络】Reducing the Dimensionality of Data with Neural Networks

    这篇paper来做什么的? 用神经网络来降维.之前降维用的方法是主成分分析法PCA,找到数据集中最大方差方向.(附:降维有助于分类.可视化.交流和高维信号的存储) 这篇paper提出了一种非线性的PC ...