QT分析之QApplication的初始化
原文地址:http://blog.163.com/net_worm/blog/static/1277024192010097430321/
在开始分析之前交代一下,一是分析的QT在Window平台实现(其它OS类似);二、分析的手段为看源码+单步跟踪。有时候会让编译器产生预编译后的输出(使用-E参数),便于观察;三、分析得QT版本为4.5.3
下面是QT经典的Hello world程序
#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h> int main( int argc, char **argv )
{
QApplication a( argc, argv );
QPushButton quit( "Quit", );
quit.resize( , );
quit.setFont( QFont( "Times", , QFont::Bold ) );
QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );
quit.show();
return a.exec();
}
第一句声明了一个QApplication的对象,QApplication的类继承关系为:
QApplication : QCoreApplication : QObject
先观察QApplication的构造函数:
QApplication::QApplication(int &argc, char **argv)
: QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient))
{ Q_D(QApplication); d->construct(); }
这里先后做了三件事:新生成一个QApplicationPrivate对象并传递给QCoreApplication;宏Q_D;调用d->construct()。
看Q_D的定义:
#define Q_D(Class) Class##Private * const d = d_func()
Q_D(QApplication);展开后是:
QApplicationPrivate * const d = d_func();
在附近正好看到Q_Q的定义:
#define Q_Q(Class) Class * const q = q_func()
由此看到在QT的程序里最好不要定义d、q这样的变量。
所以d->construct()调用的其实是
QApplicationPrivate::construct();
那么这个construct()干了什么事呢?
void QApplicationPrivate::construct()
{
initResources(); // 初始化资源 qt_is_gui_used = (qt_appType != QApplication::Tty);
process_cmdline(); // 扫描分析命令行参数
// Must be called before initialize()
qt_init( this, qt_appType ); // 在initialize()之前必须执行的初始化,例如色彩、字体、键盘等
initialize();
eventDispatcher->startingUp(); }
其中eventDispatcher->startingUp();实际调用的是:QEventDispatcherWin32::startingUp(),主要是注册事件分发器。
回来看QCoreApplication的构造过程,把QApplicationPrivate对象传递给QOjbec,然后调用init()。
QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)
: QObject(p, )
{
init();
// note: it is the subclasses' job to call
// QCoreApplicationPrivate::eventDispatcher->startingUp();
}
我们先来看QCoreApplication::init()干了什么事呢?
void QCoreApplication::init()
{
Q_D(QCoreApplication); // Get the application name/instance if qWinMain() was not invoked
set_winapp_name(); // 设置应用程序的名字 Q_ASSERT_X(!self, "QCoreApplication", "there should be only one application object");
QCoreApplication::self = this; QThread::initialize(); // 初始化线程 // use the event dispatcher created by the app programmer (if any)
if (!QCoreApplicationPrivate::eventDispatcher)
QCoreApplicationPrivate::eventDispatcher = d->threadData->eventDispatcher;
// otherwise we create one
if (!QCoreApplicationPrivate::eventDispatcher)
d->createEventDispatcher(); // 生成事件分发
Q_ASSERT(QCoreApplicationPrivate::eventDispatcher != ); if (!QCoreApplicationPrivate::eventDispatcher->parent())
QCoreApplicationPrivate::eventDispatcher->moveToThread(d->threadData->thread); d->threadData->eventDispatcher = QCoreApplicationPrivate::eventDispatcher; if (!coreappdata()->app_libpaths) {
// make sure that library paths is initialized
libraryPaths(); // 确认或设定DLL库的路径
} else {
d->appendApplicationPathToLibraryPaths();
} qt_startup_hook(); // 目前是空函数
}
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关联起来
QT分析之QApplication的初始化的更多相关文章
- 1、QT分析之QApplication的初始化
原文地址:http://blog.163.com/net_worm/blog/static/1277024192010097430321/ 在开始分析之前交代一下,一是分析的QT在Window平台实现 ...
- 2、QT分析之QPushButton的初始化
原文地址:http://blog.163.com/net_worm/blog/static/127702419201001003326522/ 在简单的QT程序的第二行,声明了一个QPushButto ...
- QT分析之QPushButton的初始化
原文地址:http://blog.163.com/net_worm/blog/static/127702419201001003326522/ 在简单的QT程序的第二行,声明了一个QPushButto ...
- Qt事件分发机制源码分析之QApplication对象构建过程
我们在新建一个Qt GUI项目时,main函数里会生成类似下面的代码: int main(int argc, char *argv[]) { QApplication application(argc ...
- 10、QT分析之WebKit
该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...
- 3、QT分析之消息事件机制
原文地址:http://blog.163.com/net_worm/blog/static/127702419201001432028526/ 上回我们分析到QPushButton的初始化,知道了Wi ...
- 5、QT分析之网络编程
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...
- QT分析之WebKit
该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...
- QT分析之网络编程
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...
随机推荐
- java instanceof 的理解
简单来说,java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法 ...
- 计算阶乘的和v2.0(4分)
题目内容: 假设有这样一个三位数m,其百位.十位和个位数字分别是a.b.c,如果m= a!+b!+c!,则这个三位数就称为三位阶乘和数(约定0!=1).请编程计算并输出所有的三位阶乘和数. 函数原型: ...
- Go语言的数据类型
1 概述 Go语言作为类C语言,支持常规的基础数据类型的的同时,支持常用的高级数据类型.他们是: 整数,int,uint,int8,uint8,int16,uint16,int32,uint32,in ...
- GeekOS: 一、构建基于Ubuntu9.04的实验环境
参考:http://www.cnblogs.com/wuchang/archive/2009/05/05/1450311.html 补充:在最后步骤中,执行bochs即可弹出运行窗口
- 成都Uber优步司机奖励政策(2月23日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 苏州Uber优步司机奖励政策(12月28日到1月3日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- day 3 创建窗口,移动-函数版
1.创建窗口 #-*- coding:utf-8 -*- import pygame import time def main(): #1.创建窗口 screen = pygame.display.s ...
- myeclipse 配置堆内存
2.非堆内存分配 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64:由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4. 打开myeclipse ...
- shell 批量压缩指定目录及子目录内图片的方法
用户上传的图片,一般都没有经过压缩,造成空间浪费.因此需要编写一个程序,查找目录及子目录的图片文件(jpg,gif,png),将大于某值的图片进行压缩处理. 查看目录文件大小 du -h --max- ...
- iOS 测试工具reveal可视化调试工具的使用
简单翻译一下reveal可视化图形工具插入项目的官方文档(官方英文版file:///Applications/Reveal.app/Contents/SharedSupport/Documentati ...