標籤:pre photo 版本 建立 分享圖片 添加 圖片 exec 介面
部落格轉載自: https://www.devbean.net/2012/08/qt-study-road-2-mainwindow/
前面一篇大致介紹了 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();}
在Windows運行結果如下
我們仔細看看這個視窗。雖然不太明顯,但它實際上分成了幾個部分:
主視窗的最上面是 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 guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = qtdemoTEMPLATE = appSOURCES += main.cpp mainwindow.cppHEADERS += 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 檔案通常會非常複雜。
Qt 學習之路 2(7):MainWindow 簡介