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

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

3天内不再提示

Qt的QApplication不简单!

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

一、导读

把焦点回到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

    文章

    3882

    浏览量

    61310
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66782
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56398
  • Qt
    Qt
    +关注

    关注

    1

    文章

    299

    浏览量

    37340

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

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

收藏 人收藏

    评论

    相关推荐

    QT串口通信的简单使用

    QT串口通信是上位机和下位机通信常用的通信方式, 也是学习QT必须学会的基础知识, 这篇就简单介绍一下QT串口通信的简单使用.
    的头像 发表于 01-15 09:27 533次阅读
    <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 514次阅读

    嵌入式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 1231次阅读

    基于QT简单的上位机

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

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

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