1. 程式人生 > >QWidget、QDialog、QMainWindow 的異同點

QWidget、QDialog、QMainWindow 的異同點

簡述

在分享所有基礎知識之前,很有必要在這裡介紹下常用的視窗 - QWidget、QDialog、QMainWindow。

QWidget繼承於QObject和QPaintDevice,QDialog和QMainWindow則繼承於QWidget,QDialog、QMainWindow兩者之間沒有直接關係。淘氣的小盆友又不高興了,它倆分明同屬於一個父親,那就是兄弟姊妹關係O(∩_∩)O哈哈~。

|

QWidget

QWidget類是所有使用者介面物件的基類。

視窗部件是使用者介面的一個原子:它從視窗系統接收滑鼠、鍵盤和其它事件,並且將自己的表現形式繪製在螢幕上。每一個視窗部件都是矩形,並且它們按Z軸順序排列。一個視窗部件可以被它的父視窗部件或者它前面的視窗部件蓋住一部分。

QWidget有很多成員函式,但是它們中的一些有少量的直接功能:例如,QWidget有字型屬性,但是自己從來不用。為很多繼承它的子類提供了實際的功能,比如QLabel、QPushButton、QCheckBox等等。

沒有父窗體的小部件始終是一個獨立的視窗(頂級視窗部件)。非視窗的小部件為子部件,它們在父視窗中顯示。Qt中大多數部件主要被用作子部件。例如:可以顯示一個按鈕作為頂層視窗,但大多數人更喜歡將按鈕內置於其它部件,如QDialog。

這裡寫圖片描述

上圖顯示了一個QGroupBox,裡面包含了大量由QGridLayout佈局的子控制元件。

QDialog

QDialog類是對話方塊視窗的基類。

對話方塊視窗是一個頂級窗體,主要用於短期任務以及和使用者進行簡要通訊。QDialog可以是模式的也可以是非模式的。QDialog支援擴充套件性並且可以提供返回值。它們可以有預設按鈕。QDialog也可以有一個QSizeGrip在它的右下角,使用setSizeGripEnabled()。

注意:QDialog(以及其它使用Qt::Dialog型別的widget)使用父視窗部件的方法和Qt中其它類稍微不同。對話方塊總是頂級視窗部件,但是如果它有一個父物件,它的預設位置就是父物件的中間。它也將和父物件共享工具條條目。

模式對話方塊

阻塞同一應用程式中其它可視視窗輸入的對話方塊。模式對話方塊有自己的事件迴圈,使用者必須完成這個對話方塊中的互動操作,並且關閉了它之後才能訪問應用程式中的其它任何視窗。模式對話方塊僅阻止訪問與對話相關聯的視窗,允許使用者繼續使用其它視窗中的應用程式。

顯示模態對話方塊最常見的方法是呼叫其exec()函式,當用戶關閉對話方塊,exec()將提供一個有用的返回值,並且這時流程控制繼續從呼叫exec()的地方進行。通常情況下,要獲得對話方塊關閉並返回相應的值,我們連線預設按鈕,例如:”確定”按鈕連線到accept()槽,”取消”按鈕連線到reject()槽。另外我們也可以連線done()槽,傳遞給它Accepted或Rejected。

非模式對話方塊

和同一個程式中其它視窗操作無關的對話方塊。在文書處理中的查詢和替換對話方塊通常是非模式的,允許使用者同時與應用程式的主視窗和對話方塊進行互動。呼叫show()來顯示非模式對話方塊,並立即將控制返回給呼叫者。

如果隱藏對話方塊後呼叫show()函式,對話方塊將顯示在其原始位置,這是因為視窗管理器決定的窗戶位置沒有明確由程式設計師指定,為了保持被使用者移動的對話方塊位置,在closeEvent()中進行處理,然後在顯示之前,將對話方塊移動到該位置。

半模式對話方塊

呼叫setModal(true)或者setWindowModality(),然後show()。有別於exec(),show() 立即返回給控制呼叫者。

對於進度對話方塊來說,呼叫setModal(true)是非常有用的,使用者必須擁有與其互動的能力,例如:取消長時間執行的操作。如果使用show()和setModal(true)共同執行一個長時間操作,則必須定期在執行過程中呼叫QApplication::processEvents(),以使使用者能夠與對話方塊互動(可以參考QProgressDialog)。

QMainWindow

QMainWindow類提供一個有選單條、工具欄、狀態條的主應用程式視窗(例如:開發Qt常用的IDE-Visual Studio、Qt Creator等)。

一個主視窗提供了構建應用程式的使用者介面框架。Qt擁有QMainWindow及其相關類來管理主視窗。

QMainWindow擁有自己的佈局,我們可以使用QMenuBar(選單欄)、QToolBar(工具欄)、QStatusBar(狀態列)以及QDockWidget(懸浮窗體),佈局有一個可由任何種類小視窗所佔據的中心區域。

例如:

這裡寫圖片描述

使用原則

  • 如果需要嵌入到其他窗體中,則基於QWidget建立。
  • 如果是頂級對話方塊,則基於QDialog建立。
  • 如果是主窗體,則基於QMainWindow建立。

在以後的Qt開發中,會經常和它們打交道。常言道,知己知彼,百戰不殆。只有瞭解它們、熟悉它們,才能更好地駕馭它們。。。

更多參考