#(7):MainWindow 簡介
[前面一篇](http://www.devbean.net/2012/08/qt-study-road-2-modules/)大致介紹了 Qt 各個模塊的相關內容,目的是對 Qt 框架有一個高屋建瓴般的了解。從現在開始,我們將開始嘗試使用 Qt 開始新的歷程。由于我們已經比較詳細地介紹過信號槽的相關內容,因此我們可以用一個新的程序開始進一步的學習,同時對信號槽有一個比較深入的理解。
`QMainWindow`是 Qt 框架帶來的一個預定義好的主窗口類。所謂主窗口,就是一個普通意義上的應用程序(不是指游戲之類的那種)最頂層的窗口。比如你現在正在使用的瀏覽器,那么主窗口就是這個瀏覽器窗口。試著回想一下經典的主窗口,通常是由一個標題欄,一個菜單欄,若干工具欄和一個任務欄。在這些子組件之間則是我們的工作區。事實上,`QMainWindow`正是這樣的一種布局。
下面我們新建一個工程。還記得在新建工程的時候,Qt Creator 通常會幫助我們創建一個`MainWindow`嗎?我們曾經為了介紹信號槽,將`main()`函數做了修改。現在我們直接使用 Qt Creator 生成的代碼來編譯運行一下:
~~~
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow win;
win.show();
return app.exec();
}
~~~
[](http://files.devbean.net/images/2012/08/qt-mw.png)
我們仔細看看這個窗口。雖然不太明顯,但它實際上分成了幾個部分:
[](http://files.devbean.net/images/2012/08/mw-struct.png)
主窗口的最上面是 Window Title,也就是標題欄,通常用于顯示標題和控制按鈕,比如最大化、最小化和關閉等。通常,各個圖形界面框架都會使用操作系統本地代碼來生成一個窗口。所以,你會看到在 KDE 上面,主窗口的標題欄是 KDE 樣式的;在 Windows 平臺上,標題欄是 Windows 風格的。如果你不喜歡本地樣式,比如 QQ 這種,它其實是自己將標題欄繪制出來,這種技術稱為 DirectUI,也就是無句柄繪制,這不在本文的討論范疇。Window Title 下面是 Menu Bar,也就是菜單欄,用于顯示菜單。窗口最底部是 Status Bar,稱為狀態欄。當我們鼠標滑過某些組件時,可以在狀態欄顯示某些信息,比如瀏覽器中,鼠標滑過帶有鏈接的文字,你會在底部看到鏈接的實際 URL。
除去上面說的三個橫向的欄,中間是以矩形區域表示。我們可以看出,最外層稱為 Tool Bar Area,用于顯示工具條區域。之所以是矩形表示,是因為,Qt 的主窗口支持多個工具條。你可以將工具條拖放到不同的位置,因此這里說是 Area。我們可以把幾個工具條并排顯示在這里,就像 Word2003 一樣,也可以將其分別放置,類似 Photoshop。在工具條區域內部是 Dock Widget Area,這是停靠窗口的顯示區域。所謂停靠窗口,就像 Photoshop 的工具箱一樣,可以停靠在主窗口的四周,也可以浮動顯示。主窗口最中間稱為 Central Widget,就是我們程序的工作區。通常我們會將程序最主要的工作區域放置在這里,類似 Word 的稿紙或者 Photoshop 的畫布等等。
對于一般的 Qt 應用程序,我們所需要做的,就是編寫我們的主窗口代碼,主要是向其中添加各種組件,比如菜單、工具欄等,當然,最重要的就是當中的工作區。當我們將這些都處理完畢之后,基本上程序的工具也可以很好地實現。
通常我們的程序主窗口會繼承自`QMainWindow`,以便獲得`QMainWindow`提供的各種便利的函數。這也是 Qt Creator 生成的代碼所做的。
由于`QMainWindow`這個類在 Qt 5 中并沒有什么改變,因此上面的代碼可以直接拿到 Qt 4 中進行編譯。事實上,我們使用 Qt Creator 生成的代碼也是可以直接在 Qt 4 中編譯。只不過需要注意一點:Qt 4 中沒有 widgets 模塊,因此在 pro 文件中,我們通常需要這么來寫:
~~~
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qtdemo
TEMPLATE = app
SOURCES += main.cpp \
mainwindow.cpp
HEADERS += mainwindow.h
~~~
簡單解釋一下 pro 文件。首先,我們定義了 QT,用于告訴編譯器,需要使用哪些模塊。這些模塊都在前面章節中有過介紹。我們通常需要添加 core 和 gui。第二行,如果 Qt 的主版本號(`QT_MAJOR_VERSION`)大于 4,也就是 Qt 5,則需要另外添加 widgets(因為在 Qt 5 中,所有組件都是在 widgets 模塊定義的)。TARGET 是生成的程序的名字。TEMPLATE 是生成 makefile 所使用的模板,比如 app 就是編譯成一個可執行程序,而 lib 則是編譯成一個鏈接庫(默認是動態鏈接庫)。SOURCES 和 HEADERS 顧名思義,就是項目所需要的源代碼文件和頭文件。現在,我們只需使用默認的 pro 文件即可。以后隨著項目的不斷增大,pro 文件通常會非常復雜。
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)