天天看點

Qt MDI Window開發

Qt MDI Window開發

版本說明

版本 作者 日期 備注
0.1 loon 2018.11.2 初稿

目錄

文章目錄

  • ​​Qt MDI Window開發​​
  • ​​版本說明​​
  • ​​目錄​​
  • ​​一、需求分析​​
  • ​​二、什麼是MDI Window​​
  • ​​三、MDI相關Qt類介紹​​
  • ​​1、QMdiArea​​
  • ​​2、QMdiSubWindow​​
  • ​​四、Qt MDI Example​​
  • ​​五、最後​​

一、需求分析

我們需要做一個類似下面結構的配置軟體,分析其基本結構,發現我們需要MDI Window作為主體UI架構,是以,我們需要了解Qt MDI Window應用程式設計。

Qt MDI Window開發

二、什麼是MDI Window

MDI,是Multiple Document Interface的縮寫,即多文檔接口,在VC++開發時,如果使用MFC,則建立工程時,一般會引導使用者去選擇單文檔窗體還是多文檔窗體。MDI是微軟為開發人員提供的用來建立同時操作多個文檔的程式設計接口。所謂Document相當于一個線程,它在屬于自己的空間中,處理特定的事務。使用者可以檢視或者完成數字報表制作、文本編輯或者畫圖等操作,僅僅通過簡單的移動滑鼠從一個空間到另一個空間。 一個MDI應用類似于Windows桌面接口,都包含多個視圖,也就是我們在MFC中常說的View。但是,與Windows桌面接口不一樣的是,MDI的視圖空間僅限于本應用之内。 MDI廣泛應用于多個窗體間傳值,同時檢視相同資料的不同表現形式,再一個浏覽器中同時打開多個網頁等方面。總之,多文檔接口多應用在需要同時處理多個事務的情形。其實,類似于我們常說的并行計算,隻是不同的表現形式罷了!

MDI應用程式至少要由兩個截然不同的視窗組成。第一個視窗叫做MDI容器(Container),可以在容器中顯示的視窗叫做MDI子視窗。

Qt也支援MDI Window,直接搜尋MDI就可以找到相關的内容,包括QMdiArea和QMdiSubWindow,其中QMdiArea就是MDI容器,QMdiSubWindow就是MDI子視窗。

三、MDI相關Qt類介紹

上面已經說過,Qt的MDI程式設計包括QMdiArea和QMdiSubWindow兩大類,QMdiArea提供容器,QMdiSubWindow提供子視窗。QMdiArea程式設計源自Qt 4.4,是以必須是Qt4.4以上才能用。

直接在幫助手冊上搜尋MDI,可以查到相關的内容:

Qt MDI Window開發

1、QMdiArea

QMdiArea小部件提供了顯示MDI視窗的區域。

QMdiArea函數本質上類似于MDI視窗的視窗管理器。例如,它繪制它自己管理的視窗,并以級聯或平鋪模式排列它們。QMdiArea通常用作QMainWindow中的中心小部件,用于建立MDI應用程式,但也可以放在任何布局中。以下代碼向主視窗添加了一個區域:

QMainWindow *mainWindow = new QMainWindow;
    mainWindow->setCentralWidget(mdiArea);      

與頂級視窗的視窗管理器不同,所有視窗标志(Qt::WindowFlags)都由QMdiArea支援,隻要這些标志由目前小部件樣式支援。如果樣式不支援特定的标志(例如,WindowShadeButtonHint),仍然可以使用showshade()對視窗進行陰影處理。

QMdiArea中的子視窗是QMdiSubWindow的執行個體。它們被添加到帶有addSubWindow()的MDI區域。将設定為内部小部件的QWidget傳遞給此函數是很常見的,但是也可以直接傳遞QMdiSubWindow。類繼承QWidget,您可以在程式設計時使用與普通頂級視窗相同的API。QMdiSubWindow還有特定于MDI視窗的行為。有關詳細資訊,請參閱QMdiSubWindow類描述。

子視窗在獲得鍵盤焦點或調用setFocus()時變為活動狀态。使用者以通常的方式移動焦點來激活視窗。MDI區域在活動視窗更改時發出子視窗激活()信号,而activeSubWindow()函數傳回活動子視窗。

便利函數subWindowList()傳回所有子視窗的清單。例如,可以在包含視窗清單的彈出菜單中使用此資訊。

子視窗按目前視窗順序排序。這用于子視窗清單()和activateNextSubWindow()和activatePreviousSubWindow()。同樣,當用cascadeSubWindows()和tileSubWindows()級聯或平鋪視窗時,也可以使用它。

QMdiArea為子視窗提供了兩種内置布局政策:cascadeSubWindows()和tileSubWindows()。兩者都是插槽,很容易連接配接到菜單項。

注意:QMdiArea的預設滾動條屬性是Qt::ScrollBarAlwaysOff。

這上面就是QMdiArea的使用介紹了,具體每個API這裡就不多說了,你可以結合給到的MDI示例去看一下如何調用的,然後在例子代碼中詳細看對應的API功能。

2、QMdiSubWindow

直接搜QMdiSubWindow,可以找到對整個類的描述以及對應的方法和屬性。

Qt MDI Window開發

QMdiSubWindow類為QMdiArea提供了子視窗類。

QMdiSubWindow表示QMdiArea中的頂級視窗,由帶有視窗裝飾的标題欄、内部小部件和(取決于目前樣式)窗框和大小搖桿組成。QMdiSubWindow有自己的布局,它由标題欄和内部小部件的中心區域組成。

構造QMdiSubWindow最常見的方法是調用QMdiArea::addSubWindow(),内部小部件作為參數。您還可以自己建立子視窗,并通過調用setWidget()設定内部小部件。

在對子視窗進行程式設計時,可以使用與普通頂級視窗相同的API(例如,可以調用show()、hide()、showMaximized()和setWindowTitle()等函數)。

QMdiSubWindow還支援MDI區域中特定于子視窗的行為。

預設情況下,每一個QMdiSubWindow在MDI區域視圖中都是可見的,但是也可以指定透明視窗移動和調整大小的行為,在這些操作中,隻有子視窗的輪廓被更新。setOption()函數用于啟用此行為。

isShaded()函數的作用是:檢測子視窗目前是否被着色。(也就是說,視窗被折疊,是以隻有标題欄是可見的)。要進入陰影模式,請調用showshade()。QMdiSubWindow在視窗狀态發生變化時發出windowStateChanged()信号(例如,當視窗最小化或恢複時)。它還會在被激活之前發出aboutToActivate()。

在鍵盤互動模式下,視窗通過鍵盤移動和調整大小。您可以通過視窗的系統菜單進入該模式。keyboardSingleStep和keyboardPageStep屬性控制小部件為每個按鍵事件移動或調整大小的距離。當按下shift鍵時,使用頁步;否則使用單步。

您還可以使用鍵盤更改活動視窗。通過同時按下control和tab鍵,下一個(使用目前的WindowOrder)子視窗将被激活。通過按下control、shift和tab,您将激活前一個視窗。這相當于調用activateNextSubWindow()和activatePreviousSubWindow()。注意,這些快捷方式會覆寫全局快捷方式,但不會覆寫QMdiAreas快捷方式。

具體的API就不一一說明了,下面我們看一下Qt自帶的例子。

四、Qt MDI Example

直接在示例中搜尋MDI,找到對應的示例,然後配置并編譯,結果如下(我打開了兩個視窗,并且讓它們平鋪):

Qt MDI Window開發

接着,我們還是在幫助手冊中找到MDI Example:

Qt MDI Window開發

可以看到該例子包含的檔案和圖檔資源。

五、最後