一、导读
把焦点回到Qt应用开发中,一般情况下,Qt应用程序的本体由main.cpp文件中的main()函数中内容描述:
#include#include"mainwindow.h" intmain(intargc,char*argv[]) { QApplicationapp(argc,argv); MainWindowwindow; window.show(); returnapp.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的指针,定义如下:
#defineQ_D(Class)Class##Private*constd=d_func()
ApplicationPrivate类的存在用于描述QApplication的私有数据,她的存在是为了Qt源码而设计的。回到QApplication的构造函数中,最后会调用init(),该函数实现如下(/qtbase/src/widgets/kernel目录中):
voidQApplicationPrivate::init() { #ifdefined(Q_OS_MACOS) QMacAutoReleasePoolpool; #endif //初始化QGuiApplication的私有数据。 QGuiApplicationPrivate::init(); //初始化资源。 initResources(); qt_is_gui_used=(application_type!=QApplicationPrivate::Tty); //处理命令行参数。 process_cmdline(); //Mustbecalledbeforeinitialize() QColormap::initialize();//初始化QColormap initializeWidgetPalettesFromTheme(); qt_init_tooltip_palette(); //初始化QApplication的私有数据 QApplicationPrivate::initializeWidgetFontHash(); //初始化QApplication对象,重磅函数 initialize(); eventDispatcher->startingUp(); #ifndefQT_NO_ACCESSIBILITY //factoryforaccessibleinterfacesforwidgetsshippedwithQt 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定义如下:
#defineqApp(static_cast(QCoreApplication::instance()))
三、结尾
QApplication就像QWidget的地基一样,GUI中的界面控件就如同“砖块”一样码在上面了。
最后,贴出参考文档中给出的一份代码,其实现背后的知识值得学习:
QCoreApplication*createApplication(int&argc,char*argv[]) { for(inti=1;i< argc; ++i) if (!qstrcmp(argv[i], "-no-gui")) return new QCoreApplication(argc, argv); return new QApplication(argc, argv); } int main(int argc, char* argv[]) { QScopedPointerapp(createApplication(argc,argv)); if(qobject_cast (app.data())){ //startGUIversion... }else{ //startnon-GUIversion... } returnapp->exec(); }
上述代码演示了如何动态创建适当类型的应用程序,小生从上述代码get到一招和五个知识点......,打住,再写就跑题了。
-
函数
+关注
关注
3文章
4365浏览量
63905 -
代码
+关注
关注
30文章
4882浏览量
70042 -
应用程序
+关注
关注
38文章
3316浏览量
58554 -
Qt
+关注
关注
1文章
312浏览量
38647
原文标题:Qt的QApplication不简单!
文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
Qt之信号与槽例子(二)
Qt使用openCV库
QT 使用及安装资料-
给初学Qt者的小TIP
qt学习之路-HelloWorld
QT4的中文手册
简约而不简单的真空断路器,它有哪些应用优势
嵌入式Linux开发,Qt开发界面中,不显示鼠标箭头

QT之嵌入式Linux下触摸屏上隐藏鼠标指针的学习笔记

Qt中的三个exec之间有什么联系
基于QT的简单的上位机

QT|编写一个简单的上位机

QT实现简单的上位机软件

基于Qt的简单arduino上位机


压敏(MOV)在电机上的应用剖析
一前言有刷直流电机是一种较为常见的直流电机。它的主要特点包括:1.结构相对简单,由定子、转子、电刷和换向器等组成;2.通过电刷与换向器的接触来实现电流的换向,从而使电枢绕组中的电流方向周期性改变,保证电机持续运转;3.具有调速性能较好等优点,可以通过改变电压等方式较为方便地调节转速。有刷直流电机在许多领域都有应用,比如一些电动工具、玩具、小型机械等。但它也存

硬件原理图学习笔记
这一个星期认真学习了硬件原理图的知识,做了一些笔记,方便以后查找。硬件原理图分为三类1.管脚类(gpio)和门电路类输入输出引脚,上拉电阻,三极管与门,或门,非门上拉电阻:正向标志作用,给悬空的引脚一个确定的状态三极管:反向三极管(gpio输出高电平,NP两端导通,被控制端导通,电压为0)->NPN正向三极管(gpio输出低电平,PN两端导通,被控制端导通,

TurMass™ vs LoRa:无线通讯模块的革命性突破
TurMass™凭借其高传输速率、强大并发能力、双向传输、超强抗干扰能力、超远传输距离、全国产技术、灵活组网方案以及便捷开发等八大优势,在无线通讯领域展现出强大的竞争力。

RZT2H CR52双核BOOT流程和例程代码分析
RZT2H是多核处理器,启动时,需要一个“主核”先启动,然后主核根据规则,加载和启动其他内核。本文以T2H内部的CR52双核为例,说明T2H多核启动流程。

干簧继电器在RF信号衰减中的应用与优势
在电子测试领域,RF(射频)评估是不可或缺的一部分。无论是研发阶段的性能测试,还是生产环节的质量检测,RF测试设备都扮演着关键角色。然而,要实现精准的RF评估,测试设备需要一种特殊的电路——衰减电路。这些电路的作用是调整RF信号的强度,以便测试设备能够准确地评估RF组件和RF电路的各个方面。衰减器的挑战衰减器的核心功能是校准RF信号的强度。为了实现这一点,衰

ElfBoard嵌入式教育科普|ADC接口全面解析
当代信息技术体系中,嵌入式系统接口作为数据交互的核心基础设施,构成了设备互联的神经中枢。基于标准化通信协议与接口规范的技术架构,实现了异构设备间的高效数据交换与智能化协同作业。本文选取模数转换接口ADC作为技术解析切入点,通过系统阐释其工作机理、性能特征及重要参数,为嵌入式学习者爱好者构建全维度接口技术认知框架。

深入理解C语言:C语言循环控制
在C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和goto,用于改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种

第 21 届(顺德)家电电源与智能控制技术研讨会圆满落幕--其利天下斩获颇丰
2025年4月25日,其利天下应大比特之邀出席第21届(顺德)家电电源与智能控制技术研讨会,已圆满落幕。一、演讲回顾我司研发总监冯建武先生在研讨会上发表了主题为《重新定义风扇驱动:一套算法兼容百种电机的有效磁链观测器方案》的演讲,介绍了我司研发自适应技术算法(简称),该方案搭载有效磁链观测器,适配百种电机类型,结合FOC算法可实现免调参稳定启动、低速静音控制

来自资深工程师对ELF 2开发板的产品测评
来自资深工程师对ELF 2开发板的使用测评

飞凌嵌入式2025嵌入式及边缘AI技术论坛圆满结束
飞凌嵌入式「2025嵌入式及边缘AI技术论坛」在深圳深铁皇冠假日酒店盛大举行,此次活动邀请到了200余位嵌入式技术领域的技术专家、企业代表和工程师用户,共享嵌入式及边缘AI技术的盛宴!

常用运放电路总结记录
一、电压跟随器电压跟随器,电路图如下:电路分析:(本文所有的运放电路分析,V+表示运放同向输入端的电压,V-表示反向输入端的电压。)1.1电压跟随器反馈电阻需不需要?在上面的电压跟随器示例中,我画上了一个反馈电阻R99,大家在学习的运放的时候,可能很多地方也会提一下这个反馈电阻,很多地方会说可加可不加,效果一样。电阻需不需要加:但是本文这里个人建议使用电压跟

运放-运算放大器经典应用电路大全-应用电路大全-20种经典电路
20种运放典型电路总结,电路图+公式1、运放的符号表示2、集成运算放大器的技术指标(1)开环差模电压放大倍数(开环增益)大Ao(Ad)=Vo/(V±V-)=107-1012倍;(2)共模抑制比高KCMRR=100db以上;(3)输入电阻大ri>1MW,有的可达100MW以上;(4)输出电阻小ro=几W-几十W3、集成运放分析方法(V+=V-虚短,ib-=ib

RDK X3新玩法:超沉浸下棋机器人开发日记
一、项目介绍产品中文名:超沉浸式智能移动下棋机器人产品英文名:Hackathon-TTT产品概念:本项目研发的下棋机器人,是一款能自主移动、具备语音交互并能和玩家在真实的棋盘上进行“人机博弈”的移动下棋平台,能够带给对弈者如同真人对弈的完美沉浸式体验——棋开得胜团队。该智能下棋机器人具备3个显著优点:真实棋盘棋子对弈:通过使用真实棋子、棋盘和机械臂,给对弈者

芯对话 | 微处理器监控电路革新:CBM70X系列 重构系统可靠性
总述在工业自动化、消费电子、汽车电子等领域,微处理器作为系统核心,其稳定运行依赖可靠的电源监控。据统计,65%的系统故障源于电源异常——工业控制设备因电压波动导致的停机频率每月平均达3.2次,便携式设备因电池管理不当造成的续航缩水普遍超过25%,汽车电子ECU因电源扰动引发的误判率在复杂工况下高达18%。传统监控方案的三大核心痛点极端电压适应性不足:当电压低

喜讯!米尔电子与安路科技达成IDH生态战略合作,共筑FPGA创新生态
以芯为基,智创未来。近日,领先的嵌入式模组厂商-米尔电子正式与国产FPGA企业安路科技达成IDH生态战略合作。双方将围绕安路科技飞龙SALDRAGON系列高性能FPSoC,联合开发核心板、开发板及行业解决方案,助力开发者开发成功,加速工业控制、边缘智能、汽车电子等领域的创新应用落地。米尔电子&安路科技IDH生态合作证书硬核技术+生态协同安路科技作为
评论