RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Qt的QApplication不簡(jiǎn)單!

嵌入式小生 ? 來(lái)源:嵌入式小生 ? 2023-02-13 10:53 ? 次閱讀

一、導(dǎo)讀

把焦點(diǎn)回到Qt應(yīng)用開(kāi)發(fā)中,一般情況下,Qt應(yīng)用程序的本體由main.cpp文件中的main()函數(shù)中內(nèi)容描述:

#include

#include"mainwindow.h"

intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);

MainWindowwindow;
window.show();

returnapp.exec();
}

在上述代碼中,創(chuàng)建了一個(gè)QApplication實(shí)例和MainWindow實(shí)例,MainWindow實(shí)例表示主窗體應(yīng)用,QApplication正是本文的描述對(duì)象,她是QWidget的“地基”。QApplication是專門(mén)的QGuiApplication,它具有一些基于QWidget應(yīng)用程序需要的功能:處理小部件特定的初始化和銷毀操作。文檔中對(duì)她是這樣描述的:

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

該類繼承自QGuiApplication類,文檔中對(duì)QGuiApplication是這樣描述的:

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

從上圖可知,QGuiApplication繼承自QCoreApplication,又來(lái)看看QCoreApplication類:

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

從上述描述可知,QApplication、QGuiApplication、QCoreApplication這三個(gè)類是“父-子”包含關(guān)系,那么在實(shí)際開(kāi)發(fā)中,該如何選擇呢?

對(duì)于任何基于QWidget的GUI應(yīng)用程序來(lái)說(shuō)(注意是基于QWidget的),無(wú)論該應(yīng)用程序在任何時(shí)間有多少個(gè)窗口,都只有一個(gè)QApplication對(duì)象;如果不是基于QWidget的GUI應(yīng)用程序,應(yīng)該使用QGuiApplication,例如QtQuick應(yīng)用,而對(duì)于不需要QWidget或者GUI的Qt應(yīng)用程序來(lái)說(shuō),應(yīng)該使用QCoreApplcation,該類不依賴于QtWidgets庫(kù)。在不需要GUI的應(yīng)用程序中,使用QCoreApplication,該類可以避免對(duì)圖形用戶界面所需的資源進(jìn)行不必要的初始化。

二、再談QApplication

在文本開(kāi)始處貼出的代碼中,main函數(shù)傳入的參數(shù)argc、argv在創(chuàng)建QApplication實(shí)例的時(shí)候傳了進(jìn)去,因?yàn)樵赒Application初始過(guò)程中需要用argv中的argc命令行參數(shù)構(gòu)造應(yīng)用程序?qū)ο?,從源碼角度看,在QApplication的構(gòu)造函數(shù)中會(huì)進(jìn)行如下操作:

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

上圖中,Q_D是一個(gè)宏定義,用于創(chuàng)建一個(gè)指向ApplicationPrivate的指針,定義如下:

#defineQ_D(Class)Class##Private*constd=d_func()

ApplicationPrivate類的存在用于描述QApplication的私有數(shù)據(jù),她的存在是為了Qt源碼而設(shè)計(jì)的?;氐絈Application的構(gòu)造函數(shù)中,最后會(huì)調(diào)用init(),該函數(shù)實(shí)現(xiàn)如下(/qtbase/src/widgets/kernel目錄中):

voidQApplicationPrivate::init()
{
#ifdefined(Q_OS_MACOS)
QMacAutoReleasePoolpool;
#endif

//初始化QGuiApplication的私有數(shù)據(jù)。
QGuiApplicationPrivate::init();

//初始化資源。
initResources();

qt_is_gui_used=(application_type!=QApplicationPrivate::Tty);
//處理命令行參數(shù)。
process_cmdline();

//Mustbecalledbeforeinitialize()
QColormap::initialize();//初始化QColormap
initializeWidgetPalettesFromTheme();
qt_init_tooltip_palette();
//初始化QApplication的私有數(shù)據(jù)
QApplicationPrivate::initializeWidgetFontHash();

//初始化QApplication對(duì)象,重磅函數(shù)
initialize();
eventDispatcher->startingUp();

#ifndefQT_NO_ACCESSIBILITY
//factoryforaccessibleinterfacesforwidgetsshippedwithQt
QAccessible::installFactory(&qAccessibleFactory);
#endif

}

從源碼角度,可以清楚地看到QApplication的構(gòu)造過(guò)程和功能,主要用于初始化與GUI相關(guān)的的資源,創(chuàng)建QApplication對(duì)象,有如下行為:

(1)使用我們的桌面設(shè)置(如palette()、font()和doubleClickInterval())來(lái)初始化應(yīng)用程序。并跟蹤這些屬性,以防止我們?nèi)值馗淖烂妫纾和ㄟ^(guò)某種控制面板。

(2)執(zhí)行事件處理,它從底層窗口系統(tǒng)接收事件并將它們分派到相關(guān)的小部件(可理解成一個(gè)事件中轉(zhuǎn)站)。通過(guò)使用sendEvent()和postEvent(),可以將自己的事件發(fā)送到小部件。

(3)解析常用的命令行參數(shù)并相應(yīng)地設(shè)置其內(nèi)部狀態(tài)。

(4)定義應(yīng)用程序的外觀,并封裝在QStyle對(duì)象中。當(dāng)然可以在運(yùn)行時(shí)使用setStyle()進(jìn)行更改。

(5)提供了通過(guò)translate()創(chuàng)建可見(jiàn)字符串的本地化操作。

(6)提供一些方便快捷的對(duì)象,便于在開(kāi)發(fā)中使用,例如desktop()和clipboard()。

(7)管理應(yīng)用程序的窗口。我們可以使用widgetAt()來(lái)詢問(wèn)哪個(gè)小部件位于某個(gè)位置,獲取topLevelWidgets()和closeAllWindows()的列表等。

(8)管理應(yīng)用程序的鼠標(biāo)指針處理。

在實(shí)際開(kāi)發(fā)中,可以通過(guò)instance()函數(shù)訪問(wèn)QApplication對(duì)象,該函數(shù)返回一個(gè)與全局qApp指針等價(jià)的指針。(qApp引用是應(yīng)用程序?qū)ο蟮奈ㄒ蝗种羔槨K葍r(jià)于QCoreApplication::instance(),但轉(zhuǎn)換為指向QApplication的指針,因此僅當(dāng)唯一的應(yīng)用程序?qū)ο笫荙Application時(shí)才有效),Qt源碼中qApp定義如下:

#defineqApp(static_cast(QCoreApplication::instance()))

三、結(jié)尾

QApplication就像QWidget的地基一樣,GUI中的界面控件就如同“磚塊”一樣碼在上面了。

最后,貼出參考文檔中給出的一份代碼,其實(shí)現(xiàn)背后的知識(shí)值得學(xué)習(xí):

QCoreApplication*createApplication(int&argc,char*argv[])
{
for(inti=1;iapp(createApplication(argc,argv));

if(qobject_cast(app.data())){
//startGUIversion...
}else{
//startnon-GUIversion...
}

returnapp->exec();
}

上述代碼演示了如何動(dòng)態(tài)創(chuàng)建適當(dāng)類型的應(yīng)用程序,小生從上述代碼get到一招和五個(gè)知識(shí)點(diǎn)......,打住,再寫(xiě)就跑題了。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62569
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3265

    瀏覽量

    57677
  • Qt
    Qt
    +關(guān)注

    關(guān)注

    1

    文章

    302

    瀏覽量

    37899

原文標(biāo)題:Qt的QApplication不簡(jiǎn)單!

文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    QT串口通信的簡(jiǎn)單使用

    QT串口通信是上位機(jī)和下位機(jī)通信常用的通信方式, 也是學(xué)習(xí)QT必須學(xué)會(huì)的基礎(chǔ)知識(shí), 這篇就簡(jiǎn)單介紹一下QT串口通信的簡(jiǎn)單使用.
    的頭像 發(fā)表于 01-15 09:27 ?1969次閱讀
    <b class='flag-5'>QT</b>串口通信的<b class='flag-5'>簡(jiǎn)單</b>使用

    Qt之信號(hào)與槽例子(二)

    Keyunchuan");}/**************Main.cpp**************/#include//所有QT應(yīng)用程序都要包含QApplication頭文件#include "
    發(fā)表于 11-07 15:13

    Qt使用openCV庫(kù)

    ,現(xiàn)在最新的是2.2,不過(guò)我用的是2.1。注意下載的時(shí)候選擇VC專用版的。安裝OpenCV2.1,我安裝在C:/OpenCV2.1新建Qt的Project在.pro文件中包含OpenCV庫(kù),很簡(jiǎn)單
    發(fā)表于 11-22 16:12

    QT 使用及安裝資料-

    。Qmake:使用此工具可以由簡(jiǎn)單的、 與平臺(tái)無(wú)關(guān)的工程文件來(lái)生成編譯所需的 Makefile。Qt Assistant:關(guān)于 Qt 的幫助文件。類似于 MSDN。可以快速地發(fā)現(xiàn)你所需要的幫助。moc:元對(duì)象
    發(fā)表于 09-28 11:04

    給初學(xué)Qt者的小TIP

    1、Hello, Qt!我們以一個(gè)非常簡(jiǎn)單Qt 程序開(kāi)始 Qt 的學(xué)習(xí)。我們首先一行行的分析代碼,然后我們將會(huì)看到怎樣編譯和運(yùn)行這個(gè)程序。1 #include 2 #include
    發(fā)表于 10-14 11:04

    qt學(xué)習(xí)之路-HelloWorld

    打算花一定的時(shí)間寫(xiě)一個(gè)完整的qt在arm運(yùn)行實(shí)驗(yàn)的教程,在學(xué)習(xí)這個(gè)教程之前,你需要配置好交叉編譯環(huán)境(arm-linux-gcc),編譯安裝arm版的qt(我編譯安裝的是運(yùn)行在mini2440開(kāi)發(fā)板
    發(fā)表于 07-09 04:46

    QT4的中文手冊(cè)

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

    簡(jiǎn)約而不簡(jiǎn)單的真空斷路器,它有哪些應(yīng)用優(yōu)勢(shì)

    簡(jiǎn)潔不簡(jiǎn)單的真空斷路器: 現(xiàn)階段的銷售市場(chǎng)狀況看來(lái),性能卓越、高開(kāi)走強(qiáng)斷能力的隔離開(kāi)關(guān)需要量非常大,也是許多大中型電氣設(shè)備企業(yè)主推的商品。但簡(jiǎn)潔好用的隔離開(kāi)關(guān)也不容忽視,其在具體的運(yùn)用中也占據(jù)豐厚
    發(fā)表于 01-11 11:14 ?567次閱讀

    嵌入式Linux開(kāi)發(fā),Qt開(kāi)發(fā)界面中,不顯示鼠標(biāo)箭頭

    Qt開(kāi)發(fā)界面中,不顯示鼠標(biāo)箭頭,有兩種方法可實(shí)現(xiàn)一、方法一,在程序中處理。#include #include "mainwindow.h
    發(fā)表于 11-02 14:21 ?22次下載
    嵌入式Linux開(kāi)發(fā),<b class='flag-5'>Qt</b>開(kāi)發(fā)界面中,不顯示鼠標(biāo)箭頭

    QT之嵌入式Linux下觸摸屏上隱藏鼠標(biāo)指針的學(xué)習(xí)筆記

    在嵌入式Linux環(huán)境下,為了觸摸屏界面的美觀,通常需要隱藏鼠標(biāo)指針對(duì)于整個(gè)應(yīng)用程序的解決方案是:QApplication::setOverrideCursor(Qt::BlankCursor);
    發(fā)表于 11-02 15:06 ?14次下載
    <b class='flag-5'>QT</b>之嵌入式Linux下觸摸屏上隱藏鼠標(biāo)指針的學(xué)習(xí)筆記

    Qt中的三個(gè)exec之間有什么聯(lián)系

    Qt中,常見(jiàn)到三個(gè)exec,第一個(gè)是QApplication::exec(),第二個(gè)是QEventLoop::exec,第三個(gè)是QThread::exec()。本文從源碼角度來(lái)看看這三個(gè)exec()。
    的頭像 發(fā)表于 03-06 09:44 ?2392次閱讀

    基于QT簡(jiǎn)單的上位機(jī)

    一、前言大家好,我是ZhengN,本次來(lái)教大家編寫(xiě)一個(gè)基于QT簡(jiǎn)單的上位機(jī)。學(xué)習(xí)一個(gè)新的東西我們都從最基礎(chǔ)地實(shí)例開(kāi)始,比如學(xué)習(xí)C語(yǔ)言我們會(huì)從編寫(xiě)一個(gè)hello程序開(kāi)始、學(xué)習(xí)嵌入式我們從點(diǎn)燈開(kāi)始
    發(fā)表于 05-08 10:57 ?16次下載
    基于<b class='flag-5'>QT</b>的<b class='flag-5'>簡(jiǎn)單</b>的上位機(jī)

    QT|編寫(xiě)一個(gè)簡(jiǎn)單的上位機(jī)

    QT | 編寫(xiě)一個(gè)簡(jiǎn)單的上位機(jī) 時(shí)間 :2023-03-19文章目錄QT | 編寫(xiě)一個(gè)簡(jiǎn)單的上位機(jī) 參考及資料: 1.打開(kāi)`QT Creat
    發(fā)表于 05-08 10:12 ?3次下載
    <b class='flag-5'>QT</b>|編寫(xiě)一個(gè)<b class='flag-5'>簡(jiǎn)單</b>的上位機(jī)

    QT實(shí)現(xiàn)簡(jiǎn)單的上位機(jī)軟件

    最近項(xiàng)目要求寫(xiě)上位機(jī)軟件,需要實(shí)現(xiàn)界面功能和串口讀寫(xiě)。界面方面用過(guò)MFC(早忘記了),網(wǎng)上查閱資料后發(fā)現(xiàn)QT在5.1版本后有自帶的串口模塊,而且用QT實(shí)現(xiàn)簡(jiǎn)單界面功能很容易上手(也就期末設(shè)計(jì)隨便玩過(guò)
    發(fā)表于 05-08 09:54 ?4次下載
    <b class='flag-5'>QT</b>實(shí)現(xiàn)<b class='flag-5'>簡(jiǎn)單</b>的上位機(jī)軟件

    基于Qt簡(jiǎn)單arduino上位機(jī)

    準(zhǔn)備工作 一塊esp8266,安裝arduinoIDE、Qt、navecate、mysql/**若沒(méi)有mysql可直接采用sqllist。 QT上位機(jī) 通信協(xié)議采用UDP(TCP同理),通過(guò)ip地址與端口實(shí)現(xiàn)數(shù)據(jù)獲取與顯示,主要用到socket。
    發(fā)表于 05-09 10:36 ?3次下載
    基于<b class='flag-5'>Qt</b>的<b class='flag-5'>簡(jiǎn)單</b>arduino上位機(jī)
    RM新时代网站-首页