Qt"Splitters"和setStretchFactor用法详解

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

你可能感兴趣的:(qt)