Qt的QApplication不简单!

一、导读
把焦点回到qt应用开发中,一般情况下,qt应用程序的本体由main.cpp文件中的main()函数中内容描述:
#include #include mainwindow.hint main(int argc, char *argv[]){    qapplication app(argc, argv);    mainwindow window;    window.show();    return app.exec();}  
在上述代码中,创建了一个qapplication实例和mainwindow实例,mainwindow实例表示主窗体应用,qapplication正是本文的描述对象,她是qwidget的“地基”。qapplication是专门的qguiapplication,它具有一些基于qwidget应用程序需要的功能:处理小部件特定的初始化和销毁操作。文档中对她是这样描述的:
该类继承自qguiapplication类,文档中对qguiapplication是这样描述的:
从上图可知,qguiapplication继承自qcoreapplication,又来看看qcoreapplication类:
从上述描述可知,qapplication、qguiapplication、qcoreapplication这三个类是“父-子”包含关系,那么在实际开发中,该如何选择呢?
对于任何基于qwidget的gui应用程序来说(注意是基于qwidget的),无论该应用程序在任何时间有多少个窗口,都只有一个qapplication对象;如果不是基于qwidget的gui应用程序,应该使用qguiapplication,例如qtquick应用,而对于不需要qwidget或者gui的qt应用程序来说,应该使用qcoreapplcation,该类不依赖于qtwidgets库。在不需要gui的应用程序中,使用qcoreapplication,该类可以避免对图形用户界面所需的资源进行不必要的初始化。
二、再谈qapplication
在文本开始处贴出的代码中,main函数传入的参数argc、argv在创建qapplication实例的时候传了进去,因为在qapplication初始过程中需要用argv中的argc命令行参数构造应用程序对象,从源码角度看,在qapplication的构造函数中会进行如下操作:
上图中,q_d是一个宏定义,用于创建一个指向applicationprivate的指针,定义如下:
#define q_d(class) class##private * const d = d_func()  
applicationprivate类的存在用于描述qapplication的私有数据,她的存在是为了qt源码而设计的。回到qapplication的构造函数中,最后会调用init(),该函数实现如下(/qtbase/src/widgets/kernel目录中):
void qapplicationprivate::init(){#if defined(q_os_macos)    qmacautoreleasepool pool;#endif     //初始化qguiapplication的私有数据。    qguiapplicationprivate::init();     //初始化资源。    initresources();    qt_is_gui_used = (application_type != qapplicationprivate::tty);    //处理命令行参数。    process_cmdline();    // must be called before initialize()    qcolormap::initialize(); //初始化qcolormap    initializewidgetpalettesfromtheme();    qt_init_tooltip_palette();    //初始化qapplication的私有数据    qapplicationprivate::initializewidgetfonthash();     //初始化qapplication对象,重磅函数    initialize();    eventdispatcher->startingup();#ifndef qt_no_accessibility    // factory for accessible interfaces for widgets shipped with qt    qaccessible::installfactory(&qaccessiblefactory);#endif}  
从源码角度,可以清楚地看到qapplication的构造过程和功能,主要用于初始化与gui相关的的资源,创建qapplication对象,有如下行为:
(1)使用我们的桌面设置(如palette()、font()和doubleclickinterval())来初始化应用程序。并跟踪这些属性,以防止我们全局地更改桌面,例如:通过某种控制面板。
(2)执行事件处理,它从底层窗口系统接收事件并将它们分派到相关的小部件(可理解成一个事件中转站)。通过使用sendevent()和postevent(),可以将自己的事件发送到小部件。
(3)解析常用的命令行参数并相应地设置其内部状态。
(4)定义应用程序的外观,并封装在qstyle对象中。当然可以在运行时使用setstyle()进行更改。
(5)提供了通过translate()创建可见字符串的本地化操作。
(6)提供一些方便快捷的对象,便于在开发中使用,例如desktop()和clipboard()。
(7)管理应用程序的窗口。我们可以使用widgetat()来询问哪个小部件位于某个位置,获取toplevelwidgets()和closeallwindows()的列表等。
(8)管理应用程序的鼠标指针处理。
在实际开发中,可以通过instance()函数访问qapplication对象,该函数返回一个与全局qapp指针等价的指针。(qapp引用是应用程序对象的唯一全局指针。它等价于qcoreapplication::instance(),但转换为指向qapplication的指针,因此仅当唯一的应用程序对象是qapplication时才有效),qt源码中qapp定义如下:
#define qapp (static_cast(qcoreapplication::instance()))  
三、结尾
qapplication就像qwidget的地基一样,gui中的界面控件就如同“砖块”一样码在上面了。
最后,贴出参考文档中给出的一份代码,其实现背后的知识值得学习:
qcoreapplication* createapplication(int &argc, char *argv[]){    for (int i = 1; i exec();}  
上述代码演示了如何动态创建适当类型的应用程序,小生从上述代码get到一招和五个知识点......,打住,再写就跑题了。


为什么要进行电池充放电测试?电池充放电系统测试步骤
关于中国联通CDMA20001x网络的特点
支付系统就该这么设计,稳的一批!!
关于柱上变压器施工工艺的详细说明
景区负氧离子监测系统报价方案是怎么样的?
Qt的QApplication不简单!
小米众筹上架了一款摩鱼智能迷你洗衣机:支持高温煮洗,主打智能操作
DEKRA德凯为海尔颁发首个智能家居Smart Home认证
盘点用在iPhone6上曾被苹果鄙视的技术
嵌入式系统电源管理实现对比
【科普】干货!带你从0了解移动机器人(四) ——移动机器人导航技术
中兴通讯助力全国应急通信演练比武 快速搭建防汛救灾通信“生命线”
Python 使用Dash快速可视化数据
OLED原理
关于无线充电的三大标准和四种实现方式的介绍
能够提供77GHz雷达芯片的厂商有哪些?是否有一些国产力量在其中?
用于5GHz以上RF测量的微同轴“尾缆”
都说AI不会打麻将?现在研究来了
3d人脸识别智能锁安全吗
人工智能思维是未来社会的常识 是点燃孩子学习的内在动力