QT 之QSplitter 切割窗口的两种方法

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

 


       https://www.baidu.com/link?url=wDEU3ozFhQfNWu-EzUB3cyWVJL-Bbt29gN-a4ANBuxYdxZ_5KxSXnUS0YXCerTC_gHQEHlv36PlBf_fVj-UFUq&wd=&eqid=b9b5728b000297d0000000035fbb7830

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 为正整数的微件, 他们的多余空间的占有率由通过数字的比例来确定的.

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页