0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Qt的QApplication不简单!

嵌入式小生 来源:嵌入式小生 2023-02-13 10:53 3654次阅读

一、导读

把焦点回到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应用程序需要的功能:处理小部件特定的初始化和销毁操作。文档中对她是这样描述的:

183b399e-ab49-11ed-bfe3-dac502259ad0.png

该类继承自QGuiApplication类,文档中对QGuiApplication是这样描述的:

184e1028-ab49-11ed-bfe3-dac502259ad0.png

从上图可知,QGuiApplication继承自QCoreApplication,又来看看QCoreApplication类:

1877ccc4-ab49-11ed-bfe3-dac502259ad0.png

从上述描述可知,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的构造函数中会进行如下操作:

1890585c-ab49-11ed-bfe3-dac502259ad0.png

上图中,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
    Qt
    +关注

    关注

    1

    文章

    312

    浏览量

    38647

原文标题:Qt的QApplication不简单!

文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
    相关推荐
    热点推荐

    QT串口通信的简单使用

    QT串口通信是上位机和下位机通信常用的通信方式, 也是学习QT必须学会的基础知识, 这篇就简单介绍一下QT串口通信的简单使用.
    的头像 发表于 01-15 09:27 2831次阅读
    <b class='flag-5'>QT</b>串口通信的<b class='flag-5'>简单</b>使用

    Qt之信号与槽例子(二)

    Keyunchuan");}/**************Main.cpp**************/#include//所有QT应用程序都要包含QApplication头文件#include "
    发表于 11-07 15:13

    Qt使用openCV库

    ,现在最新的是2.2,不过我用的是2.1。注意下载的时候选择VC专用版的。安装OpenCV2.1,我安装在C:/OpenCV2.1新建Qt的Project在.pro文件中包含OpenCV库,很简单
    发表于 11-22 16:12

    QT 使用及安装资料-

    。Qmake:使用此工具可以由简单的、 与平台无关的工程文件来生成编译所需的 Makefile。Qt Assistant:关于 Qt 的帮助文件。类似于 MSDN。可以快速地发现你所需要的帮助。moc:元对象
    发表于 09-28 11:04

    给初学Qt者的小TIP

    1、Hello, Qt!我们以一个非常简单Qt 程序开始 Qt 的学习。我们首先一行行的分析代码,然后我们将会看到怎样编译和运行这个程序。1 #include 2 #include
    发表于 10-14 11:04

    qt学习之路-HelloWorld

    打算花一定的时间写一个完整的qt在arm运行实验的教程,在学习这个教程之前,你需要配置好交叉编译环境(arm-linux-gcc),编译安装arm版的qt(我编译安装的是运行在mini2440开发板
    发表于 07-09 04:46

    QT4的中文手册

    QApplication app(argc, argv);6 QLabel *label = new QLabel(\"Hello Qt!\");7 label->
    发表于 09-28 06:29

    简约而不简单的真空断路器,它有哪些应用优势

    简洁不简单的真空断路器: 现阶段的销售市场状况看来,性能卓越、高开走强断能力的隔离开关需要量非常大,也是许多大中型电气设备企业主推的商品。但简洁好用的隔离开关也不容忽视,其在具体的运用中也占据丰厚
    发表于 01-11 11:14 615次阅读

    嵌入式Linux开发,Qt开发界面中,不显示鼠标箭头

    Qt开发界面中,不显示鼠标箭头,有两种方法可实现一、方法一,在程序中处理。#include #include "mainwindow.h
    发表于 11-02 14:21 22次下载
    嵌入式Linux开发,<b class='flag-5'>Qt</b>开发界面中,不显示鼠标箭头

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

    在嵌入式Linux环境下,为了触摸屏界面的美观,通常需要隐藏鼠标指针对于整个应用程序的解决方案是:QApplication::setOverrideCursor(Qt::BlankCursor);
    发表于 11-02 15:06 14次下载
    <b class='flag-5'>QT</b>之嵌入式Linux下触摸屏上隐藏鼠标指针的学习笔记

    Qt中的三个exec之间有什么联系

    Qt中,常见到三个exec,第一个是QApplication::exec(),第二个是QEventLoop::exec,第三个是QThread::exec()。本文从源码角度来看看这三个exec()。
    的头像 发表于 03-06 09:44 2819次阅读

    基于QT简单的上位机

    一、前言大家好,我是ZhengN,本次来教大家编写一个基于QT简单的上位机。学习一个新的东西我们都从最基础地实例开始,比如学习C语言我们会从编写一个hello程序开始、学习嵌入式我们从点灯开始
    发表于 05-08 10:57 18次下载
    基于<b class='flag-5'>QT</b>的<b class='flag-5'>简单</b>的上位机

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

    QT | 编写一个简单的上位机 时间 :2023-03-19文章目录QT | 编写一个简单的上位机 参考及资料: 1.打开`QT Creat
    发表于 05-08 10:12 3次下载
    <b class='flag-5'>QT</b>|编写一个<b class='flag-5'>简单</b>的上位机

    QT实现简单的上位机软件

    最近项目要求写上位机软件,需要实现界面功能和串口读写。界面方面用过MFC(早忘记了),网上查阅资料后发现QT在5.1版本后有自带的串口模块,而且用QT实现简单界面功能很容易上手(也就期末设计随便玩过
    发表于 05-08 09:54 4次下载
    <b class='flag-5'>QT</b>实现<b class='flag-5'>简单</b>的上位机软件

    基于Qt简单arduino上位机

    准备工作 一块esp8266,安装arduinoIDE、Qt、navecate、mysql/**若没有mysql可直接采用sqllist。 QT上位机 通信协议采用UDP(TCP同理),通过ip地址与端口实现数据获取与显示,主要用到socket。
    发表于 05-09 10:36 3次下载
    基于<b class='flag-5'>Qt</b>的<b class='flag-5'>简单</b>arduino上位机

    压敏(MOV)在电机上的应用剖析

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

    深圳市韬略科技有限公司
    23小时前
    74

    硬件原理图学习笔记

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

    张飞实战电子官方
    04-30 18:40
    287

    TurMass™ vs LoRa:无线通讯模块的革命性突破

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

    道生物联
    1天前
    424

    RZT2H CR52双核BOOT流程和例程代码分析

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

    RA生态工作室
    04-03 17:14
    2k

    干簧继电器在RF信号衰减中的应用与优势

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

    斯丹麦德电子
    04-30 11:33
    643

    ElfBoard嵌入式教育科普|ADC接口全面解析

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

    ElfBoard
    04-30 09:34
    350

    深入理解C语言:C语言循环控制

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

    合众恒跃
    04-29 18:49
    450

    第 21 届(顺德)家电电源与智能控制技术研讨会圆满落幕--其利天下斩获颇丰

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

    其利天下技术
    04-28 19:29
    1.3k

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

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

    ElfBoard
    04-28 15:03
    489

    飞凌嵌入式2025嵌入式及边缘AI技术论坛圆满结束

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

    飞凌嵌入式
    04-28 13:57
    1.5k

    常用运放电路总结记录

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

    张飞实战电子官方
    04-27 19:33
    535

    运放-运算放大器经典应用电路大全-应用电路大全-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

    张飞实战电子官方
    04-25 19:34
    417

    RDK X3新玩法:超沉浸下棋机器人开发日记

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

    地瓜机器人
    04-25 18:18
    467

    芯对话 | 微处理器监控电路革新:CBM70X系列 重构系统可靠性

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

    芯佰微电子
    04-25 10:15
    733

    喜讯!米尔电子与安路科技达成IDH生态战略合作,共筑FPGA创新生态

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

    米尔电子
    04-25 08:06
    885