QStackedLayout類把子控件進行分組或者分頁,一次只顯示一組或者一頁,隱藏其他組或者頁上的控件。QStackedLayout本身並不可見,對換頁也不提供本質的支持。圖6.5中的建頭和黑灰色的框架是Qt Designer提供爲了方便設計。爲了方便起見,Qt還提供了類QStackedWidget,這個類的佈局管理器爲QStackedLayout。
Figure 6.6. Two pages of the Preferences dialog
我們創建一個QListWidget,它的每一項爲一個控件頁的名字。然後我們創建一個QStackedLayout,調用addWidget()把每一頁的控件加入到佈局中。連接QListWidget的信號currentRowChanged(int)和QStackedLayout的函數setCurrentIndex(int)連接,改變QListWidget的當前項時換頁。最後調用QListWidget把開始頁設置爲0。這樣的對話框使用Qt Designer會更加簡單:
1. 用“Dialog”或者“Widget”模板創建一個窗體、
2. 在窗體上增加一個QListWidget和一個QStackedWidget控件。
3. 給每一頁添加子控件,子控件按佈局排列好(右擊QStackedWidget控件,選擇Insert Page菜單便可創建一個新頁。點擊右上角的左右鍵頭,可以在頁和頁之間切換)。4. 把QListWidget和QStackedWidget用水平佈局管理。
5. 連接QListWidget控件的currentRowChanged(int)信號和QStackedWidget控件的槽setCurrentIndex(int)。
6. 設置當前QListWidget控件的currentRow屬性爲0。在Qt Designer中預覽時,點擊列表控件中不同的項目,窗體就會換爲不同的頁。
Figure 6.5. QStackedLayout
起始頁爲0。爲使某一個子控件可見,指定一個頁號,調用setCurrentIndex()。一個子控件的頁號有函數indexOf()得到。圖6-6是一個Preferences對話框,以它爲例說明QStackedLayout的用法。這個對話框的左邊是一個QListWidet控件,右邊爲一個QStackedLayout。QListWidget中的每一項對應QStackedLayout中的一頁。
下面是這個類的構造函數的代碼:
PreferenceDialog::PreferenceDialog(QWidget *parent) : QDialog(parent){
...}
listWidget = new QListWidget;
listWidget->addItem(tr("Appearance"));
listWidget->addItem(tr("Web Browser"));
listWidget->addItem(tr("Mail & News"));
listWidget->addItem(tr("Advanced"));
stackedLayout = new QStackedLayout;
stackedLayout->addWidget(appearancePage);
stackedLayout->addWidget(webBrowserPage);
stackedLayout->addWidget(mailAndNewsPage);
stackedLayout->addWidget(advancedPage);
connect(listWidget, SIGNAL(currentRowChanged(int)),
stackedLayout, SLOT(setCurrentIndex(int)));
...
listWidget->setCurrentRow(0);
1. 用“Dialog”或者“Widget”模板創建一個窗體、
2. 在窗體上增加一個QListWidget和一個QStackedWidget控件。
3. 給每一頁添加子控件,子控件按佈局排列好(右擊QStackedWidget控件,選擇Insert Page菜單便可創建一個新頁。點擊右上角的左右鍵頭,可以在頁和頁之間切換)。4. 把QListWidget和QStackedWidget用水平佈局管理。
5. 連接QListWidget控件的currentRowChanged(int)信號和QStackedWidget控件的槽setCurrentIndex(int)。
6. 設置當前QListWidget控件的currentRow屬性爲0。在Qt Designer中預覽時,點擊列表控件中不同的項目,窗體就會換爲不同的頁。