http://blog.csdn.net/iamdbl/archive/2007/04/26/1586324.aspx
中英文對照Splitter handles(分隔條)
一個QSplitter控制項中可以包含其他控制項,這些控制項被一個分隔條隔開,托拽這個分隔條,裡面的控制項的大小可以改變。QSplitter控制項經常做為布局管理器使用,給使用者提供更多的介面控制。
QSplitter控制項中的子控制項總是按順序自動並肩排列(或者上下排列)。相鄰的控制項之間有一個分隔條。下面是建立圖6.7的表單的代碼:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTextEdit *editor1 = new QTextEdit;
QTextEdit *editor2 = new QTextEdit;
QTextEdit *editor3 = new QTextEdit;
QSplitter splitter(Qt::Horizontal);
splitter.addWidget(editor1);
splitter.addWidget(editor2);
splitter.addWidget(editor3);
...
splitter.show();
return app.exec();
}
Figure 6.7. The Splitter application
這個例子中的表單有一個QSplitter控制項,其中有三個水平排列的QTextEdit控制項,和布局管理器不同,QSplitter不但可以排列子控制項,還有一個可視的外觀,QSplitter控制項從QWidget繼承,擁有QWidget所有的功能。
Figure 6.8. The Splitter application's widgets
第一次是調用rightSplitter的setStretchFactor,把索引值為1的控制項(textEdit)的展開係數設定為1,第二次是調用mainSplitter的setStretchFactor(),設定控制項rightSplitter的展開係數為1。這樣,textEdit控制項就能夠得到儘可能多餘的空間。
當應用程式啟動時,QSplitter根據子控制項的初始尺寸或者sizeHint合理分配每一個子控制項的大小。程式中,我們可以調用QSplitter::setSizes()改變分隔條的位置。QSplitter還可以儲存當前的狀態,在程式下一次運行時恢複以前的狀態。下面是writeSettings()函數,儲存當前分隔條的狀態:
void MailClient::writeSettings()
{
QSettings settings("Software Inc.", "Mail Client");
settings.beginGroup("mainWindow");
settings.setValue("size", size());
settings.setValue("mainSplitter", mainSplitter->saveState());
settings.setValue("rightSplitter", rightSplitter->saveState());
settings.endGroup();
}
下面是相應的readSettings()函數:
void MailClient::readSettings()
{
QSettings settings("Software Inc.", "Mail Client");
settings.beginGroup("mainWindow");
resize(settings.value("size", QSize(480, 360)).toSize());
mainSplitter->restoreState(
settings.value("mainSplitter").toByteArray());
rightSplitter->restoreState(
settings.value("rightSplitter").toByteArray());
settings.endGroup();
}
Qt Designer也支援QSplitter。把子控制項放到合適的位置,把他們選中,選擇菜單Form|Lay out Horizontally in Splitter或者Form|Lay out Verticallly in Splitter,所選擇的子控制項就被加入到QSplitter控制項中。
對QSplitter進行水平或者垂直嵌套可以實現更加複雜的布局。例如,圖6-9所示的MailClient程式中,就是一個垂直方向的QSplitter控制項中嵌套了一個水平方向的QSplitter控制項。
Figure 6.9. The Mail Client application on Mac OS X
下面的代碼是MailClient程式的主視窗類建構函式代碼:
MailClient::MailClient()
{
...
rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget);
rightSplitter->addWidget(textEdit);
rightSplitter->setStretchFactor(1, 1);
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1);
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
readSettings();
}
建立完我們所需要顯示三個控制項(messageTreeWidget,textEdit,foldersTreeWidget)後,我們建立一個垂直的QSplitter,rightSplitter控制項,把messageTreeWidget和textEdit控制項加到rightSplitter中。然後建立一個水平的QSplitter,mainSplitter控制項,把rightSplitter和foldersTreeWidget加入到mainSplitter中。把mainSplitter做為QMainWindow的中央控制項。
當使用者改變視窗的大小時, QSplitter通常給所有的子控制項一樣的空間。在MailClient程式中,我們希望左邊的檔案樹控制項(foldersTreeWidget)和訊息樹控制項(messageTreeWidget)保持它們的大小,把其他的空間都分配給QTextEdit。這由兩個setStretchFactor()調用實現。第一個參數是0開始的子控制項的索引值,第二個參數為我們設定的展開係數,預設值為0。
Figure 6.10. The Mail Client's splitter indexing
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/iamdbl/archive/2007/04/26/1586324.aspx