第2章 窗口
2.1 主窗口
2.1.1 主窗口的框架
主窗口提供了完整的用戶窗口界面的框架,Qt用 QMainWindow和相關的類來管理主窗口。QMainWindow是從QWidget類繼承來的,所以主窗口也是一個窗口部件Widget。只是QMainWindow定義了主窗口所需的布局部件,如菜單條、工具條、狀態條、停靠部件區、中心部件區,如圖2-1所示。

圖2-1 用戶窗口界面的框架示意圖
一個主窗口可以沒有菜單條、工具條、狀態條,但必須設置中心部件。在Qt生成的C++頭文件ui_mainwindow.h代碼中,我們可以看到以下代碼:
centralWidget=new QWidget(MainWindow); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); MainWindow->setCentralWidget(centralWidget);
主窗口的框架看起來有點復雜,在Qt Designer中,一般不必太關心它的實現,Qt在生成過程中,會自動編譯在頭文件ui_mainwindow.h代碼中,只需關心自己建立的窗口部件即可。隨著學習的深入,在學習完第5章后,讀者可以很容易地讀懂這些代碼。
2.1.2 主窗口的標題
在Qt Creator中,雙擊Forms中的mainwindow.ui,進入設計模式,在設計模式界面右上角的對象面板中,選擇MainWindow選項,在右下角的屬性面板中,選擇windowTitle屬性,將MainWindow標題修改為“我的窗口”即可,如圖2-2所示。

圖2-2 主窗口屬性設置面板
重新編譯運行,窗口標題已經改成了“我的窗口”,如圖2-3所示。

圖2-3 “我的窗口”程序運行界面
在上面的操作中,Qt只是將樣式文件中的窗口標題屬性修改了,自動完成窗口標題的設置。
<property name="windowTitle"> <string>我的窗口</string> </property>
用戶也可以自己添加代碼實現窗口標題的更換,步驟如下。
(1)打開mainwindow.cpp, 添加如下代碼(增加包含文件):
#include<QTextCodec>
在MainWindow的構造函數中,增加以下代碼:
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //設置中文字符 QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312")); QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); this->setWindowTitle("我修改了窗口標題"); }
其中,包含QTextCodec,添加相應代碼是為了增加對中文的支持,否則窗口標題會顯示成亂碼,通過設置,以后程序中對中文字符的輸出都會轉換成GB2312編碼。
調用函數setWindowTitle可以設置窗口標題。
(2)重新編譯運行,可以看見設置了新的窗口標題,如圖2-4所示。

圖2-4 窗口標題修改程序運行界面
2.1.3 主窗口的圖標
給主窗口添加圖標,可以從文件也可以從資源文件中選擇圖標。本節學習如何創建資源文件,以及從資源文件中添加圖標的方法。
(1)從文件菜單中選擇新建文件或工程(New File or Project)菜單項,在“新建”界面中選擇Qt Resource file選項,如圖2-5所示。

圖2-5 添加資源對話框
(2)在工程面板中,打開資源文件ch2.qrc,單擊Add按鈕,選擇加入前綴“/”,如圖2-6所示。

圖2-6 資源編輯界面
(3)選擇添加文件。選擇logo.png,圖標logo.png添加到資源文件中,如圖2-7所示。

圖2-7 添加資源文件
(4)進入設計模式,在窗口屬性中,選擇WindowIcon,打開資源選擇對話框,單擊左上角刷新資源按鈕,選擇確定圖標,如圖2-8所示。

圖2-8 資源選擇對話框
(5)編譯運行,可以看見主窗口添加了圖標,如圖2-9所示。

圖2-9 設置窗口圖標程序運行界面
2.1.4 主窗口的基本操作
主窗口類QmainWindow是從部件類QWidget繼承的,Qt提供了豐富的操作,用戶可以從幫助系統中瀏覽學習。本節對常用的操作作一介紹。
(1)close(): 關閉當前窗口,如果是主窗口同時退出程序。
(2)hide(): 隱藏當前窗口,該操作等同于setVisible(false)。
(3)rect(): 返回當前窗口內部的區域。
(4)resize(const QSize &)/resize(int, int): 調整窗口的大小。
(5)setAutoFillBackground(bool): 設置自動填充窗口背景,當輸入值為true時,該操作用窗口的默認值刷新窗口背景;為false時,不重繪窗口背景。該操作在自定義窗口背景和繪圖時很有用。
(6)setCentralWidget(QWidget *): 設置中心部件。窗口默認的中心部件是QWidget,用戶如果想用其他部件替換,可以在MainWindow的構造函數中調用此操作。下面的代碼把中心部件替換為圖像視圖:
ui->graphicsView->show(); this->setCentralWidget(ui->graphicsView);
(7)setWindowState(Qt::WindowStates): 設置窗口的狀態,包括設置窗口為最大化、最小化、全屏和活動狀態。
(8)setWindowTitle(const QString &): 設置窗口的標題。
(9)show(): 顯示窗口。
(10)showFullScreen(): 全屏顯示窗口。
(11)showMaximized(): 最大化顯示窗口。
(12)showMinimized(): 最小化顯示窗口。
(13)showNormal(): 窗口正常大小顯示。
(14)update()/update(int, int, int, int)/update(const QRect &)/update(const QRegion &): 更新窗口的顯示,調用該操作后,窗口執行paintEvent 操作。