在分享所有基礎知識之前,很有必要在這裡介紹下常用的視窗-qwidget、qdialog、qmainwindow。
熟悉qt的同學都應該知道,在建立qt widgets項目進行類資訊選擇時會碰到它們,沒錯,很巧,每次都能碰到。是以,在以後的qt開發中,我們會經常和它們打交道。常言道,知己知彼,百戰不殆。隻有了解它們、熟悉它們,才能更好地駕馭它們。。。
qwidget繼承于qobject和qpaintdevice,qdialog和qmainwindow則繼承于qwidget,qdialog、qmainwindow兩者之間沒有直接關系。淘氣的小盆友又不高興了,它倆分明同屬于一個父親,那就是兄弟姊妹關系o(∩_∩)o哈哈哈~。
<a href="#%e7%ae%80%e8%bf%b0">簡述</a>
<a href="#qwidget">qwidget</a>
<a href="#qmainwindow">qmainwindow</a>
<a href="#qdialog">qdialog</a>
<a href="#%e6%a8%a1%e5%bc%8f%e5%af%b9%e8%af%9d%e6%a1%86">模式對話框</a>
<a href="#%e9%9d%9e%e6%a8%a1%e5%bc%8f%e5%af%b9%e8%af%9d%e6%a1%86">非模式對話框</a>
<a href="#%e5%8d%8a%e6%a8%a1%e5%bc%8f%e5%af%b9%e8%af%9d%e6%a1%86">半模式對話框</a>
<a href="#%e4%bd%bf%e7%94%a8%e5%8e%9f%e5%88%99">使用原則</a>
qwidget類是所有使用者界面對象的基類。
視窗部件是使用者界面的一個原子:它從視窗系統接收滑鼠、鍵盤和其它事件,并且将自己的表現形式繪制在螢幕上。每一個視窗部件都是矩形,并且它們按z軸順序排列。一個視窗部件可以被它的父視窗部件或者它前面的視窗部件蓋住一部分。
qwidget有很多成員函數,但是它們中的一些有少量的直接功能:例如,qwidget有字型屬性,但是自己從來不用。為很多繼承它的子類提供了實際的功能,比如qlabel、qpushbutton、qcheckbox等等。
沒有父窗體的小部件始終是一個獨立的視窗(頂級視窗部件)。非視窗的小部件為子部件,它們在父視窗中顯示。qt中大多數部件主要被用作子部件。例如:可以顯示一個按鈕作為頂層視窗,但大多數人更喜歡将按鈕内置于其它部件,如qdialog。

上圖顯示了一個qgroupbox,裡面包含了大量由qgridlayout布局的子控件。
qmainwindow類提供一個有菜單條、工具欄、狀态條的主應用程式視窗(例如:開發qt常用的ide-visual studio、qt creator等)。
一個主視窗提供了建構應用程式的使用者界面架構。qt擁有qmainwindow及其相關類來管理主視窗。
qmainwindow擁有自己的布局,我們可以使用qmenubar(菜單欄)、qtoolbar(工具欄)、qstatusbar(狀态欄)以及qdockwidget(懸浮窗體),布局有一個可由任何種類小視窗所占據的中心區域。
例如:
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等的用法。