Qt程序执行分析

您所在的位置:网站首页 qt导出可执行程序 Qt程序执行分析

Qt程序执行分析

2022-06-03 02:00| 来源: 网络整理| 查看: 265

 一个简单的控制台程序

在学习一个新的语言体系或者一个新的构架的时候,我总是喜欢先从总体框架入手,也许这是被《深入浅出MFC》所影响,这样比较便于有一个全局的观念,然后再层层剖析,层层进入,从而理解和熟悉整个语言体系或者框架。

先来看一个简单的Qt程序,用QtCreator来实现(贪图省一些事情),并且QtCreator也支持跨平台。

这个控制台程序很简单,首先是一个QCoreApplication类对象的生成,然后调用该对象的exec方式。程序运行后,只是一个不会自己关闭的控制台:

console

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程序就编写完成了。

gui

在main.cpp中,多了两个调用   

QWidget w;

   w.show();

通过简简单单的两句,就将控制台程序修改为GUI界面程序,比windows下切换要容易得多。QWidget比较复杂,在没有解释QObject之前,先不解释该对象。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3