色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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源碼而設計的?;氐絈Application的構造函數中,最后會調用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;iapp(createApplication(argc,argv));

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

returnapp->exec();
}

上述代碼演示了如何動態創建適當類型的應用程序,小生從上述代碼get到一招和五個知識點......,打住,再寫就跑題了。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68524
  • 應用程序
    +關注

    關注

    37

    文章

    3265

    瀏覽量

    57677
  • Qt
    Qt
    +關注

    關注

    1

    文章

    302

    瀏覽量

    37899

原文標題:Qt的QApplication不簡單!

文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    QT串口通信的簡單使用

    QT串口通信是上位機和下位機通信常用的通信方式, 也是學習QT必須學會的基礎知識, 這篇就簡單介紹一下QT串口通信的簡單使用.
    的頭像 發表于 01-15 09:27 ?1969次閱讀
    <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 ?567次閱讀

    嵌入式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 ?2396次閱讀

    基于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 ?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上位機
    主站蜘蛛池模板: 高跟丝袜岳第一次| 国产成人精品在视频| xnxx高中生| 俄罗斯孩交精品| 国产亚洲精品久久久999蜜臀| 黄色一级毛片免费| 伦理片97影视网| 人妻 中文无码 中出| 无码人妻丰满熟妇区五十路久久 | 午夜爱情动作片P| 亚洲偷偷自拍免费视频在线| 中文字幕无线手机在线| qvod在线电影| 国内精品乱码卡一卡2卡三卡新区 国内精品乱码卡一卡2卡三卡 | 欧美 另类 美腿 亚洲 无码| 热久久国产欧美一区二区精品| 手机在线成人精品视频网| 亚洲精品乱码一区二区三区 | 女性私密五月天| 无码AV精品一区二区三区| 一区三区三区不卡| WWW国产色情在线观看APP| 国产亚洲tv在线观看| 旧里番YY6080在线播放| 三级网址在线| 尤物久久99国产综合精品| my pico未删减在线观看| 国产色播视频在线观看| 老司机亚洲精品影院| 天天操人人射| 最近更新2019中文字幕国语| 攻把受做哭边走边肉楼梯PLAY| 精品国产在天天线在线麻豆| 欧美高清69vivo| 亚洲免费观看视频| 草莓视频在线看免费高清观看| 和姐姐做插得很深| 日本xxxxx按摩19| 伊人国产在线视频| 国产AV亚洲精品久久久久软件| 久久天天综合|