【Qt】之 Splitter分割窗口

中英文对照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);  //索引0
    rightSplitter->addWidget(textEdit); //索引1
    rightSplitter->setStretchFactor(1, 1); //指定索引为1的textEdit拉伸
    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


测试代码:
  1. QList<QTreeWidgetItem *> items;  
  2.     for (int i = 0; i < 10; ++i)  
  3.         items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));  
  4.   
  5.     QTreeWidget* messagesTreeWidget = new QTreeWidget();  
  6.     messagesTreeWidget->setColumnCount(1);  
  7.     messagesTreeWidget->insertTopLevelItems(0, items);  
  8.   
  9.     for (int i = 0; i < 10; ++i)  
  10.         items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));  
  11.   
  12.     QTreeWidget* foldersTreeWidget = new QTreeWidget();  
  13.     foldersTreeWidget->setColumnCount(1);  
  14.     foldersTreeWidget->insertTopLevelItems(0, items);  
  15.   
  16.     QTextEdit* textEdit = new QTextEdit();  
  17.     textEdit->setText(tr("happy"));  
  18.   
  19.     QSplitter* rightSplitter = new QSplitter(Qt::Vertical);  
  20.     rightSplitter->addWidget(messagesTreeWidget);   //索引0  
  21.     rightSplitter->addWidget(textEdit);             //索引1  
  22.     rightSplitter->setStretchFactor(1, 1);          //索引为X的控件拉伸  
  23.   
  24.     QSplitter* mainSplitter = new QSplitter(Qt::Horizontal);  
  25.     mainSplitter->addWidget(foldersTreeWidget);  
  26.     mainSplitter->addWidget(rightSplitter);  
  27.     mainSplitter->setStretchFactor(1, 1);  
  28.     setCentralWidget(mainSplitter);  

拉伸前:
  

拉伸后


FROM:  http://blog.csdn.net/teng_ontheway/article/details/18262827




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值