Qt程序执行分析 |
您所在的位置:网站首页 › qt导出可执行程序 › Qt程序执行分析 |
一个简单的控制台程序 在学习一个新的语言体系或者一个新的构架的时候,我总是喜欢先从总体框架入手,也许这是被《深入浅出MFC》所影响,这样比较便于有一个全局的观念,然后再层层剖析,层层进入,从而理解和熟悉整个语言体系或者框架。 先来看一个简单的Qt程序,用QtCreator来实现(贪图省一些事情),并且QtCreator也支持跨平台。 这个控制台程序很简单,首先是一个QCoreApplication类对象的生成,然后调用该对象的exec方式。程序运行后,只是一个不会自己关闭的控制台: ![]() Qt之前是闭源的,被诺基亚收购后,诺基亚基于自身的原因和Qt重量级应用KDE的压力,Qt采用GPL和GPL2协议开源了。这使得我们可以深入研究Qt的行为。 QCoreApplication干了哪些活 QCoreApplication作为一个类,在构造对象的时候,其调用的构造函数如: (src\corelib\kernel\qcoreapplication.cpp) 该构造函数总共做了三件事情,第一件事生成了一个 QCoreApplicationPrivate对象,之后调用了init方法,然后调用了QCoreApplicationPrivate对象中的时间 分派对象的startingUp方法。我们先不管QCoreApplicationPrivate为我们做了哪些工作,先看init方法又做了些什么工作: 首先使用的 Q_D(QCoreApplication)的宏,在qglobal.h中,有该宏的实现: 宏里面##表示将前后两个名称串联起来,此处Q_D(QCoreApplication)展开为 QCoreApplicationPrivate* const d = d_func(); 也就是通过调用d_func函数来获取一个QCoreApplicationPrivate对象指针。从宏在Qt全局定义上看,这种方式应该是Qt内部常用的方式。至于d_func()函数怎么实现,我们先不去了解,我们知道此处已经获取了一个QCoreApplicationPrivate的指针d。然后从d的线程数据的事件发生器转移到了QCoreApplicationPrivate 静态对象指针中。如果没有这个事件发生器,就创建一个,然后将事件发生器eventDispatcher移动到主线程上。init方法最后调用了一个 qt_startup_hook()的全局方法,该方法实际上什么事情也没有做。 在之init后调 用 QCoreApplicationPrivate::eventDispatcher->startingUp(),做了一些线程的初始化处 理工作。我们回顾头来再看一下QCoreApplicationPrivate的构造函数又帮我们做了哪些工作? (src\corelib\kernel\qcoreapplication.cpp) 除了QObjectPrivate基类调用外,其他的就是一些基本的赋值操作,不进行深入细究。Qt的实现,很是符合一些规范,即构造函数只进行一些初始化操作,并把一些可能通用的初始化操作提到了公共函数上。 之后便是程序执行开始在src\corelib\kernel\qcoreapplication.cpp中,QCoreApplication::exec的代码如下: 先是进行了一次实例检查QCoreApplicationPrivate::checkInstance("exec"): 显然,QCoreApplication::self在init函数的时候进行了初始化,赋值为this,因此该函数一般情况下必然返回true。其他的也都大同小异,核心在事件循环上,即 显然,能够使得exec长期执行,不关闭控制台窗口的,就是QEventLoop的exec的功劳了。 该函数的运行是int exec(ProcessEventsFlags flags = AllEvents); 在QCoreApplication中调用自然是等待所有事件了。 显然 while (!d->exit)一直在等待处理事件,这就是控制台不关闭的原因,在窗口程序中,就是窗口不关闭的原因了。 看到没有,又出现了Q_D宏定义。在processEvents中,事件被转发给了QEventLoopPrivate的线程数据的事件分发器。显然该事情变得十分复杂,当然也是因为足够复杂,才能够支持信号和槽以及widget的事件。 很简单的一个控制台程序,Qt为我们做了很多工作,这些工作可以使得Qt可以很方便的集合进GUI界面,因此使得这些工作变得非常值得。 学过windows程序开发的知道,在windows下或者MFC下开发,GUI界面与控制台界面截然不同,在Qt这个平台下,GUI和控制台界面的初始化开始工作是非常类似的。 简单的GUI界面程序 在main.cpp文件中实现: 构建下面一个pro文件 QT += core gui TARGET = gui TEMPLATE = app SOURCES += main.cpp 就这样一个简单的GUI程序就编写完成了。 在main.cpp中,多了两个调用 QWidget w; w.show(); 通过简简单单的两句,就将控制台程序修改为GUI界面程序,比windows下切换要容易得多。QWidget比较复杂,在没有解释QObject之前,先不解释该对象。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |