PyQt5之QApplication和QWidget
1. 序
app = QApplication(sys.argv)
每一個PyQt5程序都需要有一個QApplication對象。sys.argv是從命令行傳入的參數列表。Python腳本可以從shell中運行。這是一種通過參數來選擇啟動腳本的方式。
window = QWidget()
QWidget控件是PyQt5中所有用戶界面的父類,QWidget對象創建成為一個應用的頂層窗口。這里使用了沒有參數的默認構造函數,它沒有父類,我們稱沒有父類的控件為窗口。
由於所有的窗口和控件都是繼承與QWidget類,所以如果不為控件指定一個父對象,那么控件就會唄當作窗口處理,這時setWindowTitle()和setWindowIcon()函數就會生效
- app.exec_()的作用是運行主循環,必須調用此函數才能開始事件處理,調用該方法進入程序的主循環直到調用exit()結束。主事件循環從窗口系統接收事件,並將其分派給應用程序小部件。如果沒有該方法,那么在運行的時候還沒有進入程序的主循環就直接結束了,所以運行的時候窗口會閃退。
- app.exec_()在退出時會返回狀態代碼
- 不用sys.exit(app.exec_()),只使用app.exec_(),程序也可以正常運行,但是關閉窗口后進程卻不會退出。
- sys.exit(n)的作用是退出應用程序並返回n到父進程。
2. QApplication 詳細描述
QApplication 類管理圖形用戶界面應用程序的控制流和主要設置。 可以說QApplication是Qt的整個后台管理的命脈
它包含主事件循環,在其中來自窗口系統和其它資源的所有事件被處理和調度。它也處理應用程序的初始化和結束,並且提供對話管理。它也處理絕大多數系統范圍和應用程序范圍的設置。
對於任何一個使用Qt的圖形用戶界面應用程序,都正好存在一個QApplication對象,而不論這個應用程序在同一時間內是不是有0、1、2或更多個窗口。
QApplication 對象是可以通過全局變量qApp訪問。它的負責的主要范圍有:
它使用用戶的桌面設置,例如palette()、font()和doubleClickInterval()來初始化應用程序。如果用戶改變全局桌面,例如通過一些控制面板,它會對這些屬性保持跟蹤。
它執行事件處理,也就是說它從低下的窗口系統接收事件並且把它們分派給相關的窗口部件。通過使用sendEvent()和postEvent(),你可以發送你自己的事件到窗口部件。
它分析命令行參數並且根據它們設置內部狀態。關於這點的詳細情況請參考下面的構造函數文檔。
它定義了由QStyle對象封裝的應用程序的觀感。在運行狀態下,可以通過setStyle()來改變。
它指定了應用程序如何分配顏色。詳細情況請參考setColorSpec()。
它定義了默認文本編碼(請參考setDefaultCodec())並且提供了通過translate()用戶可見的本地化字符串。
它提供了一些像desktop()和clipboard()這樣的魔術般的對象。
它知道應用程序的窗口。你可以使用widgetAt()來詢問在一個確定點上存在哪個窗口部件,得到一個topLevelWidgets()(頂級窗口部件)的列表和通過closeAllWindows()來關閉所有窗口,等等。
它管理應用程序的鼠標光標處理,請參考setOverrideCursor()和setGlobalMouseTracking()。
在X窗口系統上,它提供刷新和同步通訊流的函數,請參考flushX()和syncX()。
它提供復雜的對話管理支持。這使得當用戶注銷時,它可以讓應用程序很好地結束,如果無法終止,撤消關閉進程並且甚至為未來的對話保留整個應用程序的狀態。詳細情況請參考isSessionRestored()、sessionId()、commitData()和saveState()。
應用程序排演實例包含了一個QApplication通常用法的典型完整的main()。
因為QApplication對象做了如此多的初始化,它必須在所有與用戶界面相關的其它類被創建之前被創建。
因為它也處理命令行參數,在應用程序中對argv解釋和修改之前創建它通常是一個好主意。(注意,也對於X11,setMainWidget()可以根據-geometry選項來改變主窗口部件。為了保持這個功能,你必須在setMainWidget()和它的任何重載之前設置你的默認。)
QApplication::QApplication ( int & argc, char ** argv )
初始化窗口系統並且使用在argv中的argc個命令行參數構造一個應用程序對象。
全局指針qApp指向這個應用程序對象。應該只有一個應用程序對象被創建。
這個應用程序對象必須在任何繪制設備(包括窗口部件、像素映射、位圖等等)之前被構造。
argc和argv是命令行傳進去的參數。比如linux里輸入一個命令
cp file.c file1.c
那么argc=3 argv就是上面那行字符串數組。
因為圖形編程有時也需要從命令行傳遞參數給程序,所以才會有argc和argv。