Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2102|回复: 2
打印 上一主题 下一主题

QSplitter 一种布局管理——分割器

[复制链接]

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
跳转到指定楼层
楼主
发表于 2020-2-4 22:43:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Qter 于 2020-2-4 23:33 编辑
  1. Header:        #include <QSplitter>
  2. qmake:         QT += widgets
  3. Inherits:        QFrame
复制代码
Properties

childrenCollapsible : bool
handleWidth : int
opaqueResize : bool
orientation : Qt::Orientation

1 childrenCollapsible 子控件是否可以被折叠。
2 handleWidth 分割线宽度。
3 opaqueResize 是否即时改变大小。
  • true-默认,当拖动分割线时,控件跟随分割线一起动。
  • false-当拖动分割线时,只有分割线动,松开鼠标后,控件才改变大小。

4 orientation 分割器方向,水平或垂直。 Qt::Horizontal Qt::Vertical

QSplitter分割器分割比例设定
QSplitter *spliter = new QSplitter(Qt::Horizontal,this);
spliter->addWidget(A);
spliter->addWidget(B);
spliter->setStretchFactor(0,3);
spliter->setStretchFactor(1,7);
即可把A、B以3:7的比例分割
setStretchFactor ( int index, int stretch )


QWidget
sizePolicy
结合控件的SizePolicy属性,来控制布局管理中的控件的尺寸自适应方式。
控件的sizePolicy说明控件在布局管理中的缩放方式。Qt提供的控件都有一个合理的缺省sizePolicy,但是这个缺省值有时不能适合所有的布局,开发人员经常需要改变窗体上的某些控件的sizePolicy。一个QSizePolicy的所有变量对水平方向和垂直方向都适用。下面列举了一些最长用的值:
A. Fixed:控件不能放大或者缩小,控件的大小就是它的sizeHint。
B. Minimum:控件的sizeHint为控件的最小尺寸。控件不能小于这个sizeHint,但是可以
放大。
C. Maximum:控件的sizeHint为控件的最大尺寸,控件不能放大,但是可以缩小到它的最小
的允许尺寸。
D. Preferred:控件的sizeHint是它的sizeHint,但是可以放大或者缩小
E. Expandint:控件可以自行增大或者缩小
注:sizeHint(布局管理中的控件默认尺寸,如果控件不在布局管理中就为无效的值)
https://www.cnblogs.com/emouse/archive/2013/05/19/3087708.html

回复

使用道具 举报

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
沙发
 楼主| 发表于 2020-2-4 22:46:35 | 只看该作者
本帖最后由 Qter 于 2020-2-4 23:19 编辑

Splitter [ˈsplɪtə] 分隔条;拆分条;分器;功率分配器;信号分离器
Collapsible  [kəˈlæpsəbl] 可折叠的;可折迭的;可伸缩;可收缩的;可拆卸的
Horizontal [ˌhɒrɪˈzɒntl] 水平的
Vertical [ˈvɜːtɪkl] 垂直的
orientation  [ˌɔːriənˈteɪʃn]  方向
opaque  [əʊˈpeɪk] 不透明的;不透光的;浑浊的;难懂;模糊;隐晦;不清楚
stretch  [stretʃ] 拉长;拽宽;撑大;抻松;有弹性(或弹力);拉紧;拉直;绷紧
Factor [ˈfæktə(r)] 因素;要素;因子;

Hint [hɪnt] 暗示;提示;示意;征兆;迹象;少许;少量
Policy [ˈpɒləsi]  政策;方针;原则
Preferred 较喜欢;喜欢…多于… prefer的过去分词和过去式
Expanding [ɪkˈspændɪŋ] 扩径;展开;扩张;膨胀;扩大
回复 支持 反对

使用道具 举报

1229

主题

2000

帖子

7607

积分

认证用户组

Rank: 5Rank: 5

积分
7607
板凳
 楼主| 发表于 2020-2-4 23:09:53 | 只看该作者
https://mp.weixin.qq.com/s?__biz=MzU1ODIyOTQ3Mg==&mid=2247483759&idx=1&sn=ac6d56b2abe497e99d87495beda72615&chksm=fc28f3e0cb5f7af601796cd305451d4549d3051d7295a770a416fa332b4cdfc15759c2b278c9&mpshare=1&scene=1&srcid=0204FYnLvez20ju7O9iLYAq2&sharer_sharetime=1580827308259&sharer_shareid=33fb973e60510684b6f44098f762e42c&key=4ee1913bca79c78b17f3785ae2a7de7735459b680518c7e1f5028e9378edc17be991e989abfe78295bac8c48834ac9b472588b0d8b0b64ff0e5174410f1ab7179387c7014c194cd0bb31890522960e00&ascene=1&uin=Mzc3MjM5MzYyOQ%3D%3D&devicetype=Windows+7&version=6208006f&lang=zh_CN&exportkey=A%2FpDN3zZoK6LdRjS%2F6nxqN0%3D&pass_ticket=G8YP2jrw5wj%2F8z3hLH2LoKrOlhW%2BEgSdWWWhFhvDLD3ZisgQnZPqhJzHLu8hOeZ5常用函数
3.3.2.1 saveState()和restoreState()
保存当前状态和恢复之前的状态。当我们使用分割器时,会改变很多控件的大小,当我们想要控件恢复某个状态时就可以使用这两个函数。
当你开发的软件再次打开时,想要恢复到上一次的布局画面,那也可以使用这两个函数,这个功能,我在下面的例子中给大家演示。

3.3.2.2 sizes()和setSizes()
获取和设置分割器中每个控件的宽度或高度。
如果分割器是水平的,那么就会从左到右设置每个控件的宽度。如果分割器是垂直的,那么就会从上到下设置每个控件的高度。
列表中的额外值被忽略。如果列表包含的值太少,则结果是未定义的,但程序仍然会很好。
分割器的总体大小不受影响。相反,根据大小的相对权重(伸缩因子),任何额外/缺失的空间都分布在控件中。
如果指定大小为0,则控件将是不可见的。
控件的大小策略被保留。也就是说,一个小于该控件的最小大小提示的值将被提示的值所取代。

3.3.3 注意事项
3.3.3.1 控件的显隐
当隐藏一个控件的时候,它的空间将被分配给其他的控件。再次展示它时,它会被恢复。

3.3.3.2 布局器与分割器的对比
在QSplitter中是不能直接添加QLayout的,这是因为QSplitter继承自QFrame的,而QLayout继承自QObject和QLayoutItem的,布局是一套算法,QSplitter是窗口控件,所以是不能直接添加的,只有布局才能添加子布局。
因为QSplitter是窗口控件,那它当然就可以使用setLayout()或使QSplitter作为QLayout的父类或使用addWidget()来代替。

3.3.4 示例
新建项目SpliterWidget,类名SpliterWidget,基类为QWidget。
拖入两个QCheckBox,并且都勾选属性checkable,checked
再拖入一个QTextEdit和QPushButton

  1. spliterwidget.h

  2. #ifndef SPLITERWIDGET_H
  3. #define SPLITERWIDGET_H
  4. #include <QWidget>
  5. #include <QSettings>

  6. namespace Ui {
  7. class SpliterWidget;
  8. }

  9. class SpliterWidget : public QWidget
  10. {
  11.     Q_OBJECT

  12. public:
  13.     explicit SpliterWidget(QWidget *parent = 0);
  14.     ~SpliterWidget();

  15. protected:
  16.     //重写关闭事件,关于事件我们以后再讲解
  17.     void closeEvent(QCloseEvent* e);private slots:
  18.     void on_check_opaqueResize_toggled(bool checked);
  19.     void on_check_collapsible_toggled(bool checked);

  20. private:
  21.     Ui::SpliterWidget *ui;
  22.     QByteArray state;
  23.     QSettings settings;
  24. };

  25. #endif // SPLITERWIDGET_H
  26. spliterwidget.cpp

  27. #include <QDebug>
  28. #include <QSettings>
  29. #include "spliterwidget.h"
  30. #include "ui_spliterwidget.h"

  31. SpliterWidget::SpliterWidget(QWidget *parent) :
  32.     QWidget(parent),
  33.     ui(new Ui::SpliterWidget),
  34.     settings("MySofts", "SpliterWidget")
  35. {
  36.     ui->setupUi(this);

  37.     //这里用来从注册表中加载分割器上一次关闭前的状态
  38.     //注册表路径为:HKEY_CURRENT_USER\Software\MySofts\SpliterWidget
  39.     if (settings.contains("splitterSizes"))
  40.     {
  41.         ui->splitter->restoreState(settings.value("splitterSizes").toByteArray());
  42.         qDebug() << "is restored";
  43.     }
  44.     else
  45.     {
  46.         qDebug() << "first launch SpliterWidget";
  47.     }
  48. }

  49. SpliterWidget::~SpliterWidget()
  50. {
  51.     delete ui;
  52. }

  53. void SpliterWidget::closeEvent(QCloseEvent *e)
  54. {
  55.     //关闭时保存分割器状态
  56.     settings.setValue("splitterSizes", ui->splitter->saveState());
  57.     QWidget::closeEvent(e);
  58. }

  59. void SpliterWidget::on_check_opaqueResize_toggled(bool checked)
  60. {
  61.     ui->splitter->setOpaqueResize(checked);
  62. }

  63. void SpliterWidget::on_check_collapsible_toggled(bool checked)
  64. {
  65.     //设置所有控件是否都可以被折叠,如果想设置某个控件,可以使用setCollapsible();
  66.     ui->splitter->setChildrenCollapsible(checked);
  67. }
复制代码
编译运行程序,调整分割器的大小,关闭窗口,再次打开程序,程序恢复关闭前分割器的状态。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-30 09:51 , Processed in 0.063851 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表