Inside Qt for Symbian QApplication/zh

From Qt Wiki
< Inside Qt for Symbian QApplication
Revision as of 15:58, 14 January 2015 by Maintenance script (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

作者: habert [developer.qt.nokia.com]

Qt for Symbian之程序启动

我们都知道Qt中只要构造出QApplication就启动了,可启动细节就很少有人知道了,当然我们编写Qt的程序无需关心这么多,这也是为什么要用Qt的原因,但如果能够了解则可以加深对Qt的认识。今天看了一下Qt for Symbian的源码,整理如下,希望对有兴趣的朋友有帮助:
第一步构造了QApplicationPrivate的实例,其中GuiClient是一个枚举常量,表示应用程序的类型,这里我们不用关心。说道 QApplicationPrivate,如果你看过Qt的源码,你会发现很多类都配对有相应的Private类,这是Qt在封装底层实现时经常用的一种模式,Handle-Body Design Pattern,也就是说你在xx类中看不到具体的实现,具体的实现都封装在xxPrivate类中,而在xx类的方法只是调用xxPrivate中相应的方法。

第二步用QApplicationPrivate的实例构造了QCoreApplication,这里调用的是QCoreApplication的QCoreApplication::QCoreApplication(QCoreApplicationPrivate &p)构造函数,代码如下:
上面代码中的init初始化了一些资源,其中包括事件分发器。

第三步定义了d,这里是通过宏Q_D来实现的,其中宏Q_D的定义如下:
所以这里的d即是调用父类构造函数QCoreApplication(*new QApplicationPrivate(argc, argv, GuiClient)时创建的QApplicationPrivate实例。

第四步调用d的construct函数,也就是QApplicationPrivate的实例的construct函数。代码如下所示:
这里也是初始化了很多资源,其中要要说的是qt_init,因为就是它创建了程序,代码如下:
代码很多,哈哈。上面代码中标有注释“这里就是创建程序的地方” 的部分:
这里将newS60Application赋值给S60->s60ApplicationFactory,而newS60Application是什么呢,我们看看它的定义:
由此可知newS60Application就是一个函数指针,它创建了一个QS60MainApplication实例,这里QS60MainApplication类封装了CAknApplication的实现。
另外上面代码中s60是一个全局数据,里面放了很多东西,主要是方便直接查询,其类结构如下:

更多Qt中文资料请访问“Qt中文论坛”:http://www.thisisqt.com/forum