## 11.5 分裂器布局
QSplitter 實質上是一個窗口部件,但同時它可以包含一些其他窗口部件。在切分窗口(splitter)中的這些窗口部件會通過切分條(splitter handle)而分隔開來。用戶可以 通過拖動這些切分條來改變切分窗口中子窗口部件的尺寸。切分窗口常常可以用作布局管理 器的替代,從而可以把更多的控制權交給用戶。
### 11.5.1使用方法
大家知道,QSplitter 是一個容器類,Qt Designer 把分裂器對象視為可以容納其它窗 口部件的布局。在 Qt Designer 中要使用分裂器布局也很容易,如圖 11-27 所示,先選中 要布局的界面元素,然后選擇工具欄上對應的按鈕或者通過菜單項或者鼠標右鍵的上下文菜 單就可以完成。

圖 11-27 使用分裂器布局
QSplitter 類可以用來創建分裂器布局,繼而實現切分窗口。 創建一個分裂器布局的一般步驟如下:
第 1 步,創建要使用的窗口部件。
第 2 步,創建分裂器布局的實例,就是 QSplitter 的實例。
第 3 步,使用 insertWidget()或者 addWidget()方法把第 1 步創建的窗口部件加入到 布局之中。
第 4 步,調用 QWidget::setLayou()方法把布局安裝到窗體上。 注意,在使用分裂器布局之前,需要包含它的頭文件聲明:
```
#include <QSplitter>
```
### 11.5.2 構造函數
QSplitter 類有兩個構造函數的原型:
```
QSplitter::QSplitter ( Qt::Orientation orientation, QWidget * parent = 0 )
```
參數 orientation 指定了分裂器的方向是水平的還是垂直的, parent 指定了父窗口。一 個使用該型構造函數的代碼示例如下:
```
QSplitter *splitterRight = new QSplitter(Qt::Vertical,splitterMain);
```
該代碼定義了一個垂直分裂器布局,并指定了它的父窗口為 splitterMain,后者也是一個分裂器布局。
```
QSplitter::QSplitter ( QWidget * parent = 0 )
```
這個型別實質上是第一種構造函數的缺省變體,它默認創建一個水平的分裂器布局。 一個使用該型構造函數的代碼示例如下:
```
QSplitter splitter(0);
```
該代碼定義了一個水平分裂器布局,并且采用程序上下文中的窗口作為父窗口。
這兩種構造函數型我們都會經常用到,請讀者朋友注意掌握。
### 11.5.3 一些深入的話題
默認情況下,在分裂器布局中的窗口部件會盡可能的按照用戶的意愿在它的最小大小 提示以及最小大小或者是最大大小之間調整。如果有需要,也可以調用 QSplitter 類的 setSizes()方法來為布局中每個窗口部件指定大小。而要獲取分裂器布局內當前的各個窗口 部件的大小,可以使用 QSplitter 類的 sizes()方法。
如果你想保存分裂器布局的構造,可以使用 QSplitter 的 saveState()和 restoreState()方法。它們通常與 QSettings 類結合使用,保存設置的代碼如下:
```
QSettings settings;
settings.setValue("splitterSizes", splitter->saveState());
```
恢復設置的代碼如下:
```
QSettings settings;
splitter->restoreState(settings.value("splitterSizes").toByteArray());
```
同前面講過的堆棧布局的情形類似,如果你想獲取分裂器布局中的窗口部件的相關信息,可以通過調用 indexof()、widget()以及 count()等方法來實現。
當你調用 hide()方法隱藏了分裂器布局中的某個窗口部件時,它會在界面上消失掉, 并且它原先占有的空間將被其它的窗口部件所 “分享”。而一旦你調用 show()方法顯示它 時,一切又會恢復原樣。
分裂器布局也是經常使用的一種,它分為分裂器水平布局和分裂器垂直布局,這可以 通過設置分裂器布局的方向來確定,如 Qt::Horizontal 和 Qt::Vertical。使用它們時,界 面效果和使用常見的水平和垂直布局幾乎沒有區別,它的最明顯特征是布局內的元素之間是 等間距的,而水平和垂直布局則不一定是這樣。
### 11.5.4 分裂器布局實例
在 QSplitter 中的子窗口部件將會自動按照創建時的順序一個挨一個的(或者一個在 另外一個的下面)放在一起,并以切分窗口拖動條( splitter bar)來分隔相鄰的窗口部 件。以下是用于創建如圖 11-28 所示的分裂器水平布局的窗口的代碼。完整的源代碼見實 例 splitter。
```
#include <QtGui>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QListWidget *listWidget = new QListWidget;
QTreeWidget *treeWidget = new QTreeWidget;
QTextEdit *editor = new QTextEdit;
QSplitter splitter(Qt::Horizontal);
splitter.addWidget(listWidget);
splitter.addWidget(treeWidget);
splitter.addWidget(editor);
listWidget->addItem(QObject::tr("Inbox"));
listWidget->addItem(QObject::tr("Outbox"));
listWidget->addItem(QObject::tr("Sent"));
listWidget->addItem(QObject::tr("Trash"));
treeWidget->setColumnCount(1);
QList<QTreeWidgetItem *> items;
for (int i = 0; i < 10; ++i)
items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item:%1").arg(i))));
treeWidget->insertTopLevelItems(0, items);
editor->setPlainText(QObject::tr("My child, my sister,\n"
"think of the sweetness\n"
"of going there to live together!\n"
"To love at leisure,\n"
"to love and to die\n"
"in a country that is the image of you!"));
splitter.setWindowTitle(QObject::tr("Splitter"));
splitter.show();
return app.exec();
}
```
把這段代碼保存成一個.cpp 文件,如 splitter.cpp,并創建一個文件夾 splitter,把splitter.cpp 文件放入其中。依次運行 qmake –project,qmake splitter.pro,mingw32- make,即可生成可執行文件。程序的運行效果如圖 11-28 所示。

圖 11-28 分裂器布局實例效果
該程序代碼比較易懂,我們簡要的講解一下。
第 1 行,加入了程序中用到的頭文件聲明,這也包括了 QSplitter 類的聲明在里面。 第 5-7 行定義了布局內用到的窗口部件。
第 8 行定義了一個分裂器水平布局。
第 9-11 行將窗口部件加入到分裂器布局之中。
第 12-15 行為 listWidget 添加一些項目。注意在這個程序中,由于 main()主函數并不 是屬于某個 QObject 類的子類,所以不能直接使用 tr()函數,而需要靜態調用它,即 QObject::tr()。
第 16 行設置 treeWidget 的列數為 1。 第 17 行聲明一個鏈表對象 items。
第 18-19 行為 items 賦值。
第 20 行將 items 的值加入到 treeWidget 中。 第 21 行為 editor 設置文本。
第 22 行設置窗口標題。
第 23-24 行顯示窗體。
- 第 1 章 走近 Qt
- 1.1 Qt 簡介
- 1.2 Qt 紀事概覽
- 1.3 Qt 套件的組成(以 Qt4.5 為準)
- 1.4 Qt 的授權
- 1.5 Qt 的產品
- 1.6 Qt 的服務與支持
- 1.7 Qt 的最新進展
- 1.8為什么選擇 Qt
- 1.9 問題與解答
- 1.10 總結與提高
- 第 2 章 Qt 的安裝與配置
- 2.1 獲取 Qt
- 2.2 協議說明
- 2.3 安裝 Qt
- 2.4 配置 Qt4 環境
- 2.5 問題與解答
- 2.6 總結與提高
- 第 3 章 Qt 編程基礎
- 3.1 標準 C++精講
- 3.2 Windows 編程基礎
- 3.3 Linux 編程基礎
- 3.4 Mac 編程基礎
- 3.5 問題與解答
- 3.6 總結與提高
- 第 4 章 Qt 4 集成開發環境
- 4.1 常見的 Qt IDE
- 4.2 Qt Creator
- 4.3 Eclipse
- 4.5 問題與解答
- 4.6 總結與提高
- 第 5 章 使用 Qt 基本 GUI 工具
- 5.1 使用 Qt Designer 進行 GUI 設計
- 5.2 使用 Qt Assistant 獲取在線文檔與幫助
- 5.3 使用 Qt Demo 學習 Qt 應用程序開發
- 5.4 問題與解答
- 5.5 總結與提高
- 第 6 章 Qt 4 程序開發方法和流程
- 6.1 開發方法
- 6.2 Hello Qt
- 6.3 幾個重要的知識點
- 6.4 問題與解答
- 6.5 總結與提高
- 第 7 章 對話框
- 7.1 QDialog 類
- 7.2 子類化 QDialog
- 7.3 快速設計對話框
- 7.4 常見內建(built in)對話框的使用
- 7.5 模態對話框與非模態對話框
- 7.6 問題與解答
- 7.7 總結與提高
- 第 8 章 主窗口
- 8.1 主窗口框架
- 8.2 創建主窗口的方法和流程
- 8.3 代碼創建主窗口
- 8.4 使用 Qt Designer 創建主窗口
- 8.5 中心窗口部件專題
- 8.6 Qt4 資源系統專題
- 8.7 錨接窗口
- 8.8 多文檔
- 8.9 問題與解答
- 8.10 總結與提高
- 第 9 章 Qt 樣式表與應用程序觀感
- 9.1 應用程序的觀感
- 9.2 QStyle 類的使用
- 9.3 樣式表概述
- 9.4 使用樣式表
- 9.5 問題與解答
- 9.6 總結與提高
- 第 10 章 在程序中使用.ui 文件
- 10.1 uic 的使用
- 10.2 Ui_YourFormName.h 文件的組成
- 10.3 編譯時加入處理.ui 文件的方法
- 10.4 運行時加入處理.ui 文件的方法
- 10.5 信號與槽的自動連接
- 10.6 問題與解答
- 10.7 總結與提高 本章主要講解了以下內容:
- 第 11 章 布局管理
- 11.1 基本概念和方法
- 11.2在 Qt Designer 中使用布局
- 11.3 基本布局實踐
- 11.4 堆棧布局
- 11.5 分裂器布局
- 11.6 自定義布局管理器
- 11.7 布局管理經驗總結
- 11.8 問題與解答
- 11.9 總結與提高
- 第 12 章 使用 Qt Creator
- 12.1 Qt Creator 概覽
- 12.2 Qt Creator 的組成
- 12.3 快捷鍵和常用技巧
- 12.4 Qt Creator 構建系統的設置
- 12.5 處理項目間依賴關系( Dependencies )
- 12.6 Qt 多版本共存時的管理
- 12.7 使用定位器在代碼間快速導航
- 12.8 如何創建一個項目
- 12.9 實例講解
- 12.10 使用 Qt Creator 調試程序
- 12.11 問題與解答
- 12.12 總結與提高
- 第 13 章 Qt 核心機制與原理
- 13.1 Qt 對標準 C++的擴展
- 13.2 信號與槽
- 13.3 元對象系統
- 13.4 Qt 的架構
- 13.5 Qt 的事件模型
- 13.6 構建 Qt 應用程序
- 13.7 總結與提高
- 附錄 A qmake 使用指南
- A.1 qmake 簡介
- A.2 使用 qmake
- 附錄 B make 命令
- B.1 命令解釋
- B.2 使用 make 自動構建
- 附錄 C Qt 資源
- C.1Qt 官方資源
- C.2 Qt 開發社區