簡述
在分享所有基礎知識之前,很有必要在這里介紹下常用的窗口-QWidget、QDialog、QMainWindow。
熟悉Qt的同學都應該知道,在新建Qt Widgets項目進行類信息選擇時會碰到它們,沒錯,很巧,每次都能碰到。所以,在以后的Qt開發中,我們會經常和它們打交道。常言道,知己知彼,百戰不殆。只有了解它們、熟悉它們,才能更好地駕馭它們。。。
QWidget繼承於QObject和QPaintDevice,QDialog和QMainWindow則繼承於QWidget,QDialog、QMainWindow兩者之間沒有直接關系。淘氣的小盆友又不高興了,它倆分明同屬於一個父親,那就是兄弟姊妹關系O(∩_∩)O哈哈哈~。
QWidget
QWidget類是所有用戶界面對象的基類。
窗口部件是用戶界面的一個原子:它從窗口系統接收鼠標、鍵盤和其它事件,並且將自己的表現形式繪制在屏幕上。每一個窗口部件都是矩形,並且它們按Z軸順序排列。一個窗口部件可以被它的父窗口部件或者它前面的窗口部件蓋住一部分。
QWidget有很多成員函數,但是它們中的一些有少量的直接功能:例如,QWidget有字體屬性,但是自己從來不用。為很多繼承它的子類提供了實際的功能,比如QLabel、QPushButton、QCheckBox等等。
沒有父窗體的小部件始終是一個獨立的窗口(頂級窗口部件)。非窗口的小部件為子部件,它們在父窗口中顯示。Qt中大多數部件主要被用作子部件。例如:可以顯示一個按鈕作為頂層窗口,但大多數人更喜歡將按鈕內置於其它部件,如QDialog。
上圖顯示了一個QGroupBox,里面包含了大量由QGridLayout布局的子控件。
QMainWindow
QMainWindow類提供一個有菜單條、工具欄、狀態條的主應用程序窗口(例如:開發Qt常用的IDE-Visual Studio、Qt Creator等)。
一個主窗口提供了構建應用程序的用戶界面框架。Qt擁有QMainWindow及其相關類來管理主窗口。
QMainWindow擁有自己的布局,我們可以使用QMenuBar(菜單欄)、QToolBar(工具欄)、QStatusBar(狀態欄)以及QDockWidget(懸浮窗體),布局有一個可由任何種類小窗口所占據的中心區域。
例如:
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)。
使用原則
- 如果需要嵌入到其他窗體中,則基於QWidget創建。
- 如果是主窗體,則基於QMainWindow創建。
- 如果是頂級對話框,則基於QDialog創建。
今天主要講解三者之間的異同點,並未一一列出所有的描述及用法,后期的實戰過程中會進行詳細講解,例如:一些常用的對話框-QFileDialog、QColorDialog、QMessageBox等的用法,主窗體QMainWindow中如何添加菜單欄、工具欄 、懸浮窗體等,QWidget及其子類-QLabel、QPushButton、QCheckBox等的用法。
原文作者:一去丶二三里
作者博客:去作者博客空間