6-3 分隔控制項(Splitters) 收藏

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.