1.自下而上(嵌套法):
//窗口布局
rightSplitter = new QSplitter(Qt::Vertical);
rightSplitter->addWidget(messagesTreeWidget); //在右窗口中添加一个邮件列表
rightSplitter->addWidget(textEdit); //显示文本邮件
rightSplitter->setStretchFactor(1, 1); //保证textEdit伸展到多余的空间
mainSplitter = new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(foldersTreeWidget);
mainSplitter->addWidget(rightSplitter);
mainSplitter->setStretchFactor(1, 1); //使用两个setStretchFactor保证了把多余的额外空间都留给textEdit
setCentralWidget(mainSplitter);
setWindowTitle(tr("Mail Client"));
效果如下图:
https://blog.csdn.net/qq_22374265/article/details/79380281
2.自上而下
//主splitter,以下填充text和子splitter
QSplitter *splitterMain=new QSplitter(Qt::Horizontal,0);
QTextEdit *textLeft=new QTextEdit(QObject::tr("Left Widget"),splitterMain);
textLeft->setAlignment(Qt::AlignCenter);
QSplitter *splitterRight=new QSplitter(Qt::Vertical,splitterMain);
splitterRight->setOpaqueResize(true);
//开始填充右边的splitter,放上两个text
QTextEdit *textTop=new QTextEdit(QObject::tr("Right Top Widget"),splitterRight);
textTop->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom=new QTextEdit(QObject::tr("Right Bottom Widget"),splitterRight);
textBottom->setAlignment(Qt::AlignCenter);
//设置主splitter
splitterMain->setStretchFactor(1,1);
splitterMain->setWindowTitle(QObject::tr("Splitter"));
https://blog.csdn.net/qq_36038987/article/details/80773848
Qt"Splitters",分界线属性调整,控件大小比例调整示例:
//主分割窗口
QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0);
QTextEdit *textLeft = new QTextEdit(QObject::tr("Left Widget"), splitterMain);
textLeft->setAlignment(Qt::AlignCenter);
//右部分割窗口
QSplitter *splitterRight = new QSplitter(Qt::Vertical, splitterMain);
splitterRight->setOpaqueResize(false);
QTextEdit *textUp = new QTextEdit(QObject::tr("Top Widget"), splitterRight);
textUp->setAlignment(Qt::AlignCenter);
QTextEdit *textBottom = new QTextEdit(QObject::tr("Bottom Widget"), splitterRight);
分界线属性如何调整呢? 我查了一下, 原来是一条分界线是一个QSplitterHandle 类对象. 通过下面的一些代码, 我们可以统一修改分界线的样式.
mainSplitter->setStyleSheet("QSplitter::handle { background-color: black }"); //设置分界线的样式
mainSplitter->setHandleWidth(20); //设置分界线的宽度
分界线的背景颜色变为"黑色", 并且宽度变得很大, 看来上述代码是起到作用了. 如果有很多条分界线, 我们希望只修改第一条的分界线, 怎么办呢? 请看下面的一行代码:
QSplitterHandle *handle = mainSplitter->handle(1); //注意不是从0 索引开始, 如果找不到分界线, 将返回NULL.
通过上述代码, 我们可以取得Left 和 Bottom 之间的分界线. 值得注意的是, mainSplitter->handle(0) 是存在的, 但是无法对其进行处理. 为了验证我们是否真的获取Left 和 Bottom 之间的分界线的对象指针, 我们写上下面的代码:
splitterMain->setStyleSheet("QSplitter::handle { background-color: black }"); //设置分界线的样式
splitterMain->setHandleWidth(1); //设置分界线的宽度
QSplitterHandle *handle = splitterMain->handle(1); //注意不是从0 索引开始, 如果找不到分界线, 将返回NULL.
if (handle)
{
handle->setFixedWidth(1);
}
QSplitterHandle *handle1 = splitterRight->handle(1); //注意不是从0 索引开始, 如果找不到分界线, 将返回NULL.
if (handle1)
{
splitterRight->setStyleSheet("QSplitter::handle { background-color: black }"); //设置分界线的样式
handle1->setFixedWidth(1);
}
对于Left和 Top 来说, 他们的本身的大小相对于整个窗口来说, 都是很小的. 这样就存在着一些多余的空间, 这些空间可以给Left, 也可以给Top, 或者两个平分. 对于Left 和 Top 各自空间大小的控制, 是通过 QSplitter 的 setStretchFactor 方法, 该方法的声明:
(所以需要成对设置)
void setStretchFactor(int index, int stretch);
第一个参数index 是子微件的索引值, 从0 开始. 这里的话,Left是0, Top 是1; 第二个参数 stretch 是拉伸系数, int 类型, 下面主要对stretch 的数值进行说明.
1. splitterMain->setStretchFactor(0, 1);
2. splitterMain->setStretchFactor(1, 5);
拉伸系数为负整数的微件将占据最大的多余空间. 他们内部也应该存在着一个默认拉伸系数值0. stretch为 0 的微件, 将把最大多余空间让给stretch 为正整数的微件. 如果有多个stretch 为正整数的微件, 他们的多余空间的占有率由通过数字的比例来确定的.