QSplitter

转载 2011年01月13日 21:41:00

      看了《C++ Gui Programming With Qt 4 2nd》第六章"布局管理器"的第三节"Splitters", 并且做了里面的例子, 感觉怎么跟书里面的图像很不相同. 特别是那些分界线, 存在是存在, 但是跟背景一模一样, 书上也没说明怎么处理分界线(可能后面有讲,这个我就不清楚了).

    QSplitter * mainSplitter = new QSplitter(Qt::Horizontal);
    QLabel *label = new QLabel(QObject::tr("A"));
    QLabel *label2 = new QLabel(QObject::tr("B"));

    mainSplitter->addWidget(label2);
    mainSplitter->addWidget(label);

    mainSplitter->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
    mainSplitter->show();

       在main方法里面写上上述代码, 运行后(注意看分界线, 看不到吧):

       

       书里面是:

       

       分界线方面的差距挺大的呢? 我查了一下, 原来是一条分界线是一个QSplitterHandle 类对象.  通过下面的一些代码, 我们可以统一修改分界线的样式.

    mainSplitter->setStyleSheet("QSplitter::handle { background-color: black }"); //设置分界线的样式

    mainSplitter->setHandleWidth(20);      //设置分界线的宽度

       加了上述两行代码后的效果如下:

       

      分界线的背景颜色变为"黑色", 并且宽度变得很大, 看来上述代码是起到作用了. 如果有很多条分界线, 我们希望只修改第一条的分界线, 怎么办呢?  请看下面的一行代码:

QSplitterHandle *handle = mainSplitter->handle(1); //注意不是从0 索引开始, 如果找不到分界线, 将返回NULL.

      通过上述代码, 我们可以取得B 和 A 之间的分界线. 值得注意的是, mainSplitter->handle(0) 是存在的, 但是无法对其进行处理. 为了验证我们是否真的获取B 和 A 之间的分界线的对象指针, 我们写上下面的代码:

    if(handle)
    {
        handle->setFixedWidth(1); 
    }

      效果如下:

      

      我们把B 和 A 之间的分界线的宽度修改为1了. 如果你想让分界线失去拖动的功能, 你可以写上 handle->setDisabled(true); 使其无效. 上面的分界线明显偏向了B 那边, 并且离A 有点距离, 看来要做得完善点, 还要耗点功夫才行呢!


      对于B 和 A 来说, 他们的本身的大小相对于整个窗口来说, 都是很小的. 这样就存在着一些多余的空间, 这些空间可以给B, 也可以给A, 或者两个平分. 对于B 和 A 各自空间大小的控制, 是通过 QSplitter 的 setStretchFactor 方法, 该方法的声明:

      void setStretchFactor(int index, int stretch);

      第一个参数index 是子微件的索引值, 从0 开始. 这里的话, B 是0, A 是1; 第二个参数 stretch 是拉伸系数, int 类型, 下面主要对stretch 的数值进行说明.

      1.  mainSplitter->setStretchFactor(0, -2);

      效果如下,

      

      B占据了所有多余的空间, 看来 stretch 的值如果为负整数, 那这个微件将占据最大的空间.

      2.     mainSplitter->setStretchFactor(0, -2);
              mainSplitter->setStretchFactor(1, -4);

      效果如下:

      

      B 和 A 平分了空间, 看来stretch 如果是负整数就会尽可能的占据空间, 而不看负整数的大小, 把 -2 改为 -12, 结果一样的.

      3.     mainSplitter->setStretchFactor(0, 0);
              mainSplitter->setStretchFactor(1, 0);

       效果同第二.

       4.       mainSplitter->setStretchFactor(0, 0);  //可以把这段注释掉, 效果一样
                 mainSplitter->setStretchFactor(1, 1);

       效果如下:

       

       5.     mainSplitter->setStretchFactor(0, 4);
               mainSplitter->setStretchFactor(1, 8);

       效果如下:

       

       6.     mainSplitter->setStretchFactor(0, -4);
               mainSplitter->setStretchFactor(1, 8);

      效果如下,

      

       从 1, 2 和 6 的测试效果可以看出, 拉伸系数为负整数的微件将占据最大的多余空间.

       从3, 4 和 5 的测试效果来看, 就算我们不设置 B 或 A 的拉伸系数stretch, 他们内部也应该存在着一个默认拉伸系数值0. stretch为 0 的微件, 将把最大多余空间让给stretch 为正整数的微件. 如果有

相关文章推荐

Qt QSplitter 分割窗口

  • 2013年06月02日 20:02
  • 5KB
  • 下载

Qt下用QSplitter实现滑动窗口

  • 2017年11月16日 12:26
  • 5KB
  • 下载

【QT学习记录】Qt分割窗口QSplitter类

今天在做多个widget布局时,用到了这个QSplitter类,作用是将多个widget在一个窗口中按设定的比例分割。 先简单介绍一下该类的相关基础知识: 1. 使用该类的头文件: #includ...
  • tgzjz
  • tgzjz
  • 2015年04月22日 16:37
  • 1568

Qt学习之QSplitter

  • 2016年03月17日 16:49
  • 4KB
  • 下载

QSplitter在QTabWidget中使用

今天在使用窗体分割的时候,用到了QSplitter这个控件,初次使用在网上找了个例子,但是例子非常之简单。当然普通的使用肯定是满足的,我是使用在QTabWidget控件中和mainwindow中。在m...

Qt使用QSplitter实现分割窗口

分割窗口在应用程序中经常用到,它可以灵活分布窗口布局,经常用于类似文件资源管理器的窗口设计中,然后抱着这样的想法简单的实现了下     [cpp] view plain ...

Qt布局管理: 分割窗口QSplitter类讲解(纯代码实现分割窗口)

一个QSplitter是一个可以包含其他控件的控件,这些控件被一个分隔条隔开,托拽这个分隔条,可以改变splitter的子控件的大小。QSplitter控件经常做为布局管理器使用,给用户提供更多的界面...

Qt分割窗口QSplitter类

转载地址:http://blog.csdn.net/tgzjz/article/details/45197003 今天在做多个widget布局时,用到了这个QSplitter类,作用是将多个widg...

QSplitter使用方法

1 QSplitter的用途     QSplitter使得用户可以通过拖动子窗口之间的边界来控制它们的大小,例如 2 QSplitter的添加方法     QSplitter的添加方法有2种:a...

Qt学习2之QSplitter类的理解

学习了一遍QSplitter类的使用,分割窗口,选择基类为“QMainWindow” #include "qtsplitter.h" #include #include #include #i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:QSplitter
举报原因:
原因补充:

(最多只允许输入30个字)