3.3 分割器

简介: 3.3 分割器

有时候在布局中的子控件并不能完全显示,或者我们希望某个子控件能暂时占据更多的显示空间,这时,我们就需要用到另一种布局管理——分割器。

当你将鼠标移动到子控件之间的间隔线时,鼠标会变成如下形状

01ebd755782e4c909dad0843d3544acf.jpeg

3.3.1 QSplitter

01ebd755782e4c909dad0843d3544acf.jpeg

1 childrenCollapsible 子控件是否可以被折叠。

2 handleWidth 分割线宽度。

3 opaqueResize 是否即时改变大小。

  • true-默认,当拖动分割线时,控件跟随分割线一起动。
  • false-当拖动分割线时,只有分割线动,松开鼠标后,控件才改变大小。

4 orientation 分割器方向,水平或垂直。


3.3.2 常用函数

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

01ebd755782e4c909dad0843d3544acf.jpeg

spliterwidget.h

#ifndef SPLITERWIDGET_H
#define SPLITERWIDGET_H
#include <QWidget>
#include <QSettings>
namespace Ui {
class SpliterWidget;
}
class SpliterWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SpliterWidget(QWidget *parent = 0);
    ~SpliterWidget();
protected:
    //重写关闭事件,关于事件我们以后再讲解
    void closeEvent(QCloseEvent* e);
private slots:
    void on_check_opaqueResize_toggled(bool checked);
    void on_check_collapsible_toggled(bool checked);
private:
    Ui::SpliterWidget *ui;
    QByteArray state;
    QSettings settings;
};
#endif // SPLITERWIDGET_H

spliterwidget.cpp

#include <QDebug>
#include <QSettings>
#include "spliterwidget.h"
#include "ui_spliterwidget.h"
SpliterWidget::SpliterWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SpliterWidget),
    settings("MySofts", "SpliterWidget")
{
    ui->setupUi(this);
    //这里用来从注册表中加载分割器上一次关闭前的状态
    //注册表路径为:HKEY_CURRENT_USER\Software\MySofts\SpliterWidget
    if (settings.contains("splitterSizes"))
    {
        ui->splitter->restoreState(settings.value("splitterSizes").toByteArray());
        qDebug() << "is restored";
    }
    else
    {
        qDebug() << "first launch SpliterWidget";
    }
}
SpliterWidget::~SpliterWidget()
{
    delete ui;
}
void SpliterWidget::closeEvent(QCloseEvent *e)
{
    //关闭时保存分割器状态
    settings.setValue("splitterSizes", ui->splitter->saveState());
    QWidget::closeEvent(e);
}
void SpliterWidget::on_check_opaqueResize_toggled(bool checked)
{
    ui->splitter->setOpaqueResize(checked);
}
void SpliterWidget::on_check_collapsible_toggled(bool checked)
{
    //设置所有控件是否都可以被折叠,如果想设置某个控件,可以使用setCollapsible();
    ui->splitter->setChildrenCollapsible(checked);
}

编译运行程序,调整分割器的大小,关闭窗口,再次打开程序,程序恢复关闭前分割器的状态。


好了,关于分割器的内容今天先讲到这里,我们下期再见。


更多干货,请关注微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。

相关文章
|
网络协议 Java 关系型数据库
【Eureka】java.net.ConnectException: Connection refused: connect
【Eureka】java.net.ConnectException: Connection refused: connect
2365 0
|
Web App开发 域名解析 缓存
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
本文我们主要为大家介绍在 Ubuntu 20.04 上安装 Node.js 和 npm 的三种不同的方式。
129911 7
如何在 Ubuntu 20.04 上安装 Node.js 和 npm
|
3月前
|
安全 数据安全/隐私保护 C++
Qt C++ 键盘事件全解析:从基础到高级,实现精彩互动体验
Qt C++ 键盘事件全解析:从基础到高级,实现精彩互动体验
593 0
|
开发框架 前端开发 JavaScript
BSC链上进行智能合约开发部署规则详情
BSC(Binance Smart Chain)是一个基于区块链的智能合约平台,类似于以太坊。它提供了一个开发者友好的环境,可以用于创建和部署智能合约。如果你有一些编程经验,并且熟悉区块链和智能合约的基本概念,你可以按照以下步骤在BSC链上进行智能合约开发:
|
NoSQL 关系型数据库 MySQL
别忘了,今天是你的节日(波场充值回调)
别忘了,今天是你的节日(波场充值回调)
216 0
别忘了,今天是你的节日(波场充值回调)
|
数据可视化 JavaScript Java
还在手动配置Nginx?太LOW了,这个超强大的 Nginx 可视化管理工具太牛逼了!
还在手动配置Nginx?太LOW了,这个超强大的 Nginx 可视化管理工具太牛逼了!
|
计算机视觉
qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(持续更新示例)
qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(持续更新示例)
qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(持续更新示例)
|
存储 数据可视化 持续交付
Github continuous deployment (CD) 最佳实践
Github continuous deployment (CD) 最佳实践
131 0
Github continuous deployment (CD) 最佳实践