成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

新手必學 Qt 類簡介之 Qt QApplication 類

移動開發(fā)
QApplication類管理圖形用戶界面應用程序的控制流和主要設置。 它包含主事件循環(huán),在其中來自窗口系統(tǒng)和其它資源的所有事件被處理和調(diào)度。

一、詳細描述

QApplication 類管理圖形用戶界面應用程序的控制流和主要設置。 可以說 QApplication Qt的整個后臺管理的命脈

它包含主事件循環(huán),在其中來自窗口系統(tǒng)和其它資源的所有事件被處理和調(diào)度。它也處理應用程序的初始化和結束,并且提供對話管理。它也處理絕大多數(shù)系統(tǒng)范圍和應用程序范圍的設置。

對于任何一個使用Qt的圖形用戶界面應用程序,都正好存在一個QApplication對象,而不論這個應用程序在同一時間內(nèi)是不是有0、1、2或更多個窗口。

QApplication 對象是可以通過全局變量qApp訪問。它的負責的主要范圍有:

它使用用戶的桌面設置,例如palette()、font()和doubleClickInterval()來初始化應用程序。如果用戶改變?nèi)肿烂妫缤ㄟ^一些控制面板,它會對這些屬性保持跟蹤。
它執(zhí)行事件處理,也就是說它從低下的窗口系統(tǒng)接收事件并且把它們分派給相關的窗口部件。通過使用sendEvent()和postEvent(),你可以發(fā)送你自己的事件到窗口部件。

它分析命令行參數(shù)并且根據(jù)它們設置內(nèi)部狀態(tài)。關于這點的詳細情況請參考下面的構造函數(shù)文檔。

它定義了由QStyle對象封裝的應用程序的觀感。在運行狀態(tài)下,可以通過setStyle()來改變。

它指定了應用程序如何分配顏色。詳細情況請參考setColorSpec()。

它定義了默認文本編碼(請參考setDefaultCodec())并且提供了通過translate()用戶可見的本地化字符串。

它提供了一些像desktop()和clipboard()這樣的魔術般的對象。

它知道應用程序的窗口。你可以使用widgetAt()來詢問在一個確定點上存在哪個窗口部件,得到一個topLevelWidgets()(***窗口部件)的列表和通過closeAllWindows()來關閉所有窗口,等等。

它管理應用程序的鼠標光標處理,請參考setOverrideCursor()和setGlobalMouseTracking()。

在X窗口系統(tǒng)上,它提供刷新和同步通訊流的函數(shù),請參考flushX()和syncX()。

它提供復雜的對話管理支持。這使得當用戶注銷時,它可以讓應用程序很好地結束,如果無法終止,撤消關閉進程并且甚至為未來的對話保留整個應用程序的狀態(tài)。詳細情況請參考isSessionRestored()、sessionId()、commitData()和saveState()。

應用程序排演實例包含了一個QApplication通常用法的典型完整的main()。

因為QApplication對象做了如此多的初始化,它必須在所有與用戶界面相關的其它類被創(chuàng)建之前被創(chuàng)建。

因為它也處理命令行參數(shù),在應用程序中對argv解釋和修改之前創(chuàng)建它通常是一個好主意。(注意,也對于X11,setMainWidget()可以根據(jù)-geometry選項來改變主窗口部件。為了保持這個功能,你必須在setMainWidget()和它的任何重載之前設置你的默認。)

#p#

二、QApplication兩類構造的講解

QApplication::QApplication ( int & argc, char ** argv )

初始化窗口系統(tǒng)并且使用在argv中的argc個命令行參數(shù)構造一個應用程序對象。

全局指針qApp指向這個應用程序對象。應該只有一個應用程序對象被創(chuàng)建。

這個應用程序對象必須在任何繪制設備(包括窗口部件、像素映射、位圖等等)之前被構造。

注意argc和argv也可以被改變。Qt會移除它能夠識別的命令行參數(shù)。原來的argc和argv稍后可以通過qApp->argc()和qApp->argv()來訪問。argv()的文檔中包含如何處理命令行參數(shù)的詳細描述。
Qt調(diào)試選項(如果Qt被使用被定義的QT_NO_DEBUG標記進行編譯,這些選項就是不可用的):

-nograb,告訴Qt永遠不要捕獲鼠標或者鍵盤。

-dograb (只有在X11下),在調(diào)試器下運行可能導致和-nograb沖突,使用-dograb來覆蓋。

-sync (只有在X11下),為了調(diào)試切換為同步模式。

更詳細的解釋請參考調(diào)試技術。

#p#

所有的Qt程序自動支持下面這些命令行選項:

-style= style,設置應用程序圖形用戶界面風格。可能的值有motif、windows和platinum。如果你使用其它風格編譯Qt或者有作為插件編譯了其它風格,那么它們都可以被用作-style命令行選項。

-style style,這個和上面的一樣。

-session= session,從以前的對話中重新載入應用程序。

-session session,這個和上面的一樣。

X11版本的Qt也支持傳統(tǒng)的X11命令行選項:

-display display,設置X顯示(默認為$DISPLAY)。

-geometry geometry,設置主窗口部件的客戶端位置和大小。

-fn或者-font font,定義應用程序的字體。這個字體必須使用X邏輯字體描述來北指定。

-bg或者-background color,設置默認背景色和應用程序調(diào)色板(亮的和暗的陰影將被計算出來)。

-fg或者-foreground color,設置默認前景色。

-btn或者-button color,設置默認按鈕顏色。

-name name,設置應用程序名稱。

-title title,設置應用程序標題。

-visual TrueColor,強制應用程序在8位顯示上使用真彩圖像。

-ncols count,如果應用程序使用QApplication::ManyColor顏色規(guī)格,在8位顯示中限制顏色立方體重分配的顏色。如果count為216,那么一個6x6x6的顏色立方體將被使用(也就是說6級紅色,6級綠色和6級藍色),對于其它值,與2x3x1立方體成比例的立方體將被使用。

-cmap,導致應用程序在8位顯示上安裝一個私有的顏色映射。

QApplication::QApplication ( int & argc, char ** argv, bool GUIenabled )

構造一個使用argv中argc個命令行參數(shù)的應用程序對象。如果GUIenabled為真,圖形用戶界面應用程序被構造,否則非圖形用戶界面(命令行)應用程序被創(chuàng)建。

對于沒有圖形用戶界面的程序,設置GUIenabled為假可以在沒有窗口系統(tǒng)的情況下運行。

在X11下,如果GUIenabled為真,窗口系統(tǒng)被初始化。如果GUIenabled為假,應用程序不連接X服務器。在Windows和Macintosh,現(xiàn)在窗口系統(tǒng)總是被初始化,而不管GUIenabled的值。在Qt未來的版本這也許會改變。

對于線程配置(也就是說當Qt已經(jīng)被作為線程庫建立),應用程序全局互斥量在構造函數(shù)中將被鎖定并且當使用exec()進入事件循環(huán)中時解鎖。如果你不調(diào)用exec(),你必須明顯地對這個互斥量解鎖,否則你將會在應用程序退出時得到警告。

下面這個例子顯示如何創(chuàng)建在可能情況下使用圖形界面的應用程序。

  1. int main( int argc, char **argv )  
  2.   {  
  3. #ifdef Q_WS_X11  
  4.     bool useGUI = getenv( "DISPLAY" ) != 0;  
  5. #else  
  6.     bool useGUI = TRUE;  
  7. #endif  
  8.     QApplication app(argc, argv, useGUI);  
  9.  
  10.     if ( useGUI ) {  
  11.        //開始圖形用戶界面版本  
  12.        ...  
  13.     } else {  
  14.        //開始非圖形用戶界面版本  
  15.        ...  
  16.     }  
  17.     return app.exec();  
  18.   } 

#p#

三、窗口管理

在窗口管理方面,對于獨立的1個進程,qApplication 提供窗口管理的成員函數(shù)有(多進程的窗口管理,這里暫不介紹):

  1. QDesktopWidget * QApplication::desktop () [靜態(tài)] 

返回桌面窗口部件(也調(diào)用根窗口)。

桌面窗口部件對于獲得屏幕大小很有用。在桌面上繪制也是可能的。我們建議不要假設可以在桌面上繪制,因為它不能在所有的操作系統(tǒng)上工作。

  1. QDesktopWidget *d = QApplication::desktop();  
  2. int w = d->width();     // 返回桌面寬度  
  3. int h = d->height();    // 返回桌面高度  
  4. QWidgetList * QApplication::allWidgets () [靜態(tài)] 

返回應用程序中所有窗口部件的列表。

這個列表必須使用new來被創(chuàng)建并且必須被調(diào)用者刪除。

如果沒有窗口部件,這個列表為空(QPtrList::isEmpty())。

注意一些窗口部件也許被隱藏。

更新所有窗口部件的實例:

  1. QWidgetList  *list = QApplication::allWidgets();  
  2. QWidgetListIt it( *list );         // 遍歷窗口部件  
  3. QWidget * w;  
  4. while ( (w=it.current()) != 0 ) {  // 對于每一個窗口部件……  
  5.     ++it;  
  6.     w->update();  
  7. }  
  8. delete list;                      // 刪除這個列表,不是這個窗口部件 
  1. QWidgetList * QApplication::topLevelWidgets () [靜態(tài)] 

返回應用程序中***窗口部件的列表。

這個列表是使用new創(chuàng)建的并且必須由調(diào)用者刪除。

如果沒有***窗口部件,這個列表是空的(QPtrList::isEmpty())。

注意一些***窗口部件也許被隱藏了,例如如果當前沒有工具提示被顯示的工具提示。

實例:

  1. // 顯示所有隱藏的***窗口部件。  
  2.  
  3. QWidgetList  *list = QApplication::topLevelWidgets();  
  4. QWidgetListIt it( *list );  // 遍歷窗口部件  
  5. QWidget * w;  
  6. while ( (w=it.current()) != 0 ) {   // 對每一個***窗口部件  
  7.     ++it;  
  8.     if ( !w->isVisible() )  
  9.         w->show();  
  10. }  
  11. delete list;                // 刪除這個列表,而不是窗口部件 
  1. QWidget * QApplication::topLevelAt ( int x, int y ) [static] 

返回最上層x,y點的widget, 可以用來定位最上層窗口

返回當前層x,y點的widget, 可以用來定位當前窗口,和topLevelAt不同的是 widgetAt是以global

  1. QWidget * QApplication::widgetAt ( int x, int y ) [static] 

screen position 來判斷的,而topLevelAt是以顯示區(qū)域為坐標區(qū)域的。

  1. void QApplication::closeAllWindows () [static slot] 

關閉所有***窗口。

  1. exitAct = new QAction(tr("E&xit"), this);  
  2. exitAct->setShortcuts(QKeySequence::Quit);  
  3. exitAct->setStatusTip(tr("Exit the application"));  
  4. connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); 

#p#

四、關于事件循環(huán)

qApplication 的事件循環(huán),就是MainLoop的事件循環(huán),當然它的原理和QEventLoop的原理是一樣的。

void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static]

Processes all pending events for the calling thread according to the specified flags until there are no more events to process.

You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).

In event you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not be processed. This can affect the behaviour of widgets, e.g. QToolTip, that rely on DeferredDelete events to function properly. An alternative would be to call sendPostedEvents() from within that local loop.
Calling this function processes events only for the calling thread.

大體意思就是預先調(diào)用處于隊列狀態(tài)的事件,直到全部處理完畢。這個函數(shù)大多用于系統(tǒng)繁忙時,導致一些事件被延后了(如繪制事件等),用此函數(shù)可保證全部事件處理完畢后在繼續(xù)執(zhí)行。常見于show(),update()之后調(diào)用。

Note: 這個函數(shù)線程安全

五、事件的發(fā)送

關于事件的發(fā)送有兩種方式:

  1. bool QApplication::sendEvent ( QObject * receiver, QEvent * event ) [靜態(tài)] 

使用notify()函數(shù)直接發(fā)送事件event給接受者receiver。返回由事件處理器返回的值。

這個事件在它被發(fā)送時,不能被刪除。通常的訪問方式是在棧中創(chuàng)建這個事件,例如:

  1. QMouseEvent me( QEvent::MouseButtonPress, pos, 0, 0 );  
  2. QApplication::sendEvent( mainWindow, &me ); 

如果你在堆中創(chuàng)建這個事件,你就必須刪除它。

  1. void QApplication::postEvent ( QObject * receiver, QEvent * event ) [靜態(tài)] 

把事件event添加為對象receiver的接收對象,把它添加到事件隊列中并且立即返回。

這個時間必須在堆中被分配,因為遞送事件隊列將會得到事件的所有權并且一旦它被遞送就刪除它。

當控制返回主事件循環(huán),存儲在隊列中的所有事件將被使用notify()函數(shù)發(fā)送。

基本上Qt大部分的地方都是用到sendEvent, 而少部分地方會用到postEvent, 研究線程安全的童鞋可以多看看這方面的資料

小結:QApplication 包含主事件循環(huán),在其中來自窗口系統(tǒng)和其它資源的所有事件被處理和調(diào)度。它也處理應用程序的初始化和結束,并且提供對話管理。它也處理絕大多數(shù)系統(tǒng)范圍和應用程序范圍的設置。對于任何一個使用Qt的圖形用戶界面應用程序,都正好存在一個 QApplication 對象,而不論這個應用程序在同一時間內(nèi)是不是有0、1、2或更多個窗口。

責任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關推薦

2011-06-16 11:04:07

Qt

2011-06-16 11:13:13

QtQWidget

2011-06-14 15:28:44

QT

2011-06-16 17:19:33

Qt Meego

2011-06-16 10:38:13

Qt多線程編程

2011-06-14 15:45:02

Qt Object

2011-07-04 16:12:00

QT QWidget

2011-06-15 10:49:26

Qt QTableItem

2011-06-30 11:23:29

Qt 線程

2011-06-22 15:24:50

Qt 線程

2011-07-04 14:00:11

QT QEvent

2011-06-14 16:31:27

QT

2011-06-23 11:16:39

Qt Excel

2011-06-24 15:06:40

QT

2011-06-30 16:38:07

Qt QTableWidg

2011-06-24 14:17:58

Qt 容器類 QVector

2011-06-22 09:58:04

QT 集合類

2011-06-15 16:50:09

Qt 模塊

2011-06-14 16:07:13

Qt QSettings類

2011-07-04 16:20:54

QT 窗口 QWidget
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品福利 | 成人久草 | 亚洲视频在线观看一区二区三区 | 日本不卡免费新一二三区 | 欧美aa在线| 久久伊人精品一区二区三区 | 国产一级片一区二区三区 | 欧美日韩在线精品 | 在线小视频 | 国产精品美女久久久 | 91看片在线观看 | av黄在线观看 | 国产japanhdxxxx麻豆| 精品国产乱码久久久久久中文 | 精品免费视频 | 久久久久久99 | 成人在线观看免费视频 | 国产高清在线精品一区二区三区 | 91视频精选 | 亚洲精品99999 | 日韩欧美电影在线 | 国产精品久久久久久福利一牛影视 | 国产一区二区在线看 | 亚洲91视频| 久久国产精品99久久久大便 | 久久亚洲综合 | 成人一区二 | 99精品视频在线 | 国产在线视频在线观看 | 日韩在线电影 | 欧美亚洲在线视频 | 国产精品色 | 亚洲成网站 | 日韩在线观看中文字幕 | 在线2区 | 国产91一区二区三区 | 亚洲天堂999 | 国产亚洲成av人在线观看导航 | 97天天干| 亚洲精品一区二区三区四区高清 | 国产成人99久久亚洲综合精品 |