QSplitter(分离器或分隔符)

2023-11-17

QSplitter(分离器或分隔符)

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

本文出自本人原创著作《Qt5.10 GUI完全参考手册》网盘地址:
https://pan.baidu.com/s/1iqagt4SEC8PUYx6t3ku39Q
《C++语法详解》网盘地址:https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

若对C++语法不熟悉,建议参阅本人所著《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是一本全面了解C++不可多得的案头必备图书。

5.4.1 QSplitter类(分离器)

QSplitter类继承自QFrame类,也就是说该类是一个带有边框的可视部件。QSplitter类实现了分离器,分离器用于分离两个部件(原理见图5-39),用户可通过拖动部件之间的分界线来调整子部件的大小。
在这里插入图片描述
QSplitter的实现原理(见图5-39)与QBoxLayout布局的原理类似,即QSplitter把子部件以水平或垂直的方式添加到QSplitter中,只不过在这些子部件之间多了一条分界线,另外QSplitter继承自QFrmae,因此QSplitter是有边框的。而且它可以作为容器和窗口使用,但不推荐使用QPushButton pb(&splitter)的形式向QSplitter中添加子部件。
动态调整是指移动分界线时部件大小随之动态的改变。若不是动态调整的,则在移动分界线时部件大小不会改变,当完成分界线的移动时(即松开鼠标时),部件的大小才改变。
分离器中的子部件会随着分离器大小的改变而改变,当分离器大小改变时,分离器会重新分配空间,以使其所有子部件的相对大小保持相同的比例不变。
子部件的大小策略对分离器不起作用,分离器会把子部件填充满整个空间,即使子部件的大小策略设置为Fixed,仍会被拉伸。
1、分界线(QSplitterHandle类)
 分界线是由QSplitterHandle类实现的,QSplitter类本身不实现分界线。因此QSplitterHandle是一个部件,而QSplitter是另一个部件,这是两个部件,只不过这两个部件通过Qt的内部设计让他们关联在一起,产生了一定的联系。
 QSplitter的分界线默认有可能是看不见的(因为颜色与QSplitter背景色相同,所以看不见),因此要使分界线可见,需设置分界线的背景色。
 分界线的索引从0开始编号,分界线的数量与子部件的数量一样多。但索引为0的分界线始终是隐藏的。对于垂直分离器,索引为0的子部件上方的分界线索引为0,对于水平分离器(对于从左到右的语言),则索引为0的子部件左侧的分界线的索引为0,对于从右到左的语言,则索引为0的子部件右侧的分界线的索引为0。

2、使用QSplitter的步骤如下:
①、创建一个QSplitter。
②、使用addWidget()函数把子部件添加到QSplitter中。
③、代码如下:
在这里插入图片描述

3、QSplitter类的属性
在这里插入图片描述
4、QSplitter类的函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例5.18:QSplitter类(分离器)的使用

#include<QtWidgets>
int main(int argc, char *argv[]){    QApplication a(argc,argv);
    QWidget w;							QSplitter *ps=new QSplitter(Qt::Vertical);
    QPushButton *pb=new QPushButton("AAA");    QPushButton *pb1=new QPushButton("BBB");
    QPushButton *pb2=new QPushButton("CCC");
    QPushButton *pb3=new QPushButton("DDD",ps);   //不推荐此种方式向分离器中添加子部件
    pb1->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);	//大小策略不起作用
    pb->setMaximumSize(175,55);  							//最大最小值仍可限制子部件
    ps->addWidget(pb);    	ps->addWidget(pb1);	    ps->addWidget(pb2);
    ps->addWidget(pb3);  			//pb3已在分离器ps中,因此把pb3移至新位置
//设置分离器的边框
ps->setFrameShadow(QFrame::Raised);	ps->setFrameShape(QFrame::Box);	ps->setLineWidth(5);
    ps->setChildrenCollapsible(0);  	//子部件不可折叠
    ps->setOpaqueResize(1);   		//动态调整子部件
    ps->setStretchFactor(0,1);  		//设置拉伸因子,以调整初始显示时各子部件间的位置
    ps->setStretchFactor(1,2);    ps->setStretchFactor(2,2);
ps->setHandleWidth(5);    		//设置分界线的宽度
//设置分界线的背景色为蓝色,若不设置背景色,则分界线可能会不可见
    ps->setStyleSheet("QSplitter::handle{background-color: blue}");  	//样式表见第13章
    QVBoxLayout *pv=new QVBoxLayout;     pv->addWidget(ps);    		//把分离器ps添加到布局pv中
    w.setLayout(pv);	    w.resize(300,200);        w.show();    return a.exec();  }

运行结果及说明见图5-41
在这里插入图片描述
示例5.19:QSplitter综合示例(设计的界要和要求见图5-42)
//m.h文件的内容

#ifndef M_H
#define M_H
#include<QtWidgets>
#include <iostream>
using namespace std;
class B:public QSplitter{    Q_OBJECT
public:    static QString ddd;   //用于存储来自行编辑器输入的文本
    		B(Qt::Orientation o=Qt::Horizontal,QWidget* p=0):QSplitter(o,p){}
 public slots:
    void f(){ int j=0;        	//计数器
    		int i[3]={0};   		//用于存储从文本ddd中提出取来的数字。
    		QString s1=ddd;
    		while(!s1.isEmpty()){  s1=ddd.section(",",j,j);  	//提取文本中以","分隔的数字
    			if(j>2)return;     		//如果文本中的数字个数大于等于3个,则退出函数。
    			i[j]=s1.toInt();   		//把提取出来的数字赋值给数组i。
   			j++;}
    moveSplitter(i[0],i[1]);  } };    /*使用文本中输入的前两个数字设置分界线的位置。注意:这个函数是受保护的,若索引(第二个参数)超出范围,该函数会产生错误。*/
class C:public QWidget{    Q_OBJECT
public:	B *ps;           			//分离器
    QLineEdit *pe,*pe1;	    QLabel *pl,*pl1;    QPushButton *pb,*pb1,*pb2,*pb3,*pb4,*pb5;
    QByteArray b;    				//用于保存和恢复分离器的状态
C(QWidget* p=0):QWidget(p){    	//构造函数
    		ps=new B(Qt::Vertical);    	pl=new QLabel("EnterSize");   pl1=new QLabel("pose,index");
    		pe=new QLineEdit;   		pe1=new QLineEdit;
    		pe->setClearButtonEnabled(1);   pe1->setClearButtonEnabled(1);//显示行编辑器的清除按钮
pb=new QPushButton("AAA");	pb1=new QPushButton("BBB");   	pb2=new QPushButton("CCC");
pb3=new QPushButton("save");		    	pb4=new QPushButton("restore");
//布置分离器ps的子部件。
    		ps->addWidget(pb);    ps->addWidget(pb1);    ps->addWidget(pb2);
//设置分离器的边框及其他属性
    ps->setFrameShadow(QFrame::Raised);    ps->setFrameShape(QFrame::Box);
    ps->setLineWidth(5);					ps->setChildrenCollapsible(0); 
    //设置分离器的边框样式后,重新设置分离器的大小策略,否则分离器可能不会扩展。
ps->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
//设置分界线的背景色为蓝色,若不设置背景色,则分界线可能会不可见
    ps->setHandleWidth(5);   ps->setStyleSheet("QSplitter::handle{background-color: blue}");
//布置主窗口的子部件
    QVBoxLayout *pv=new QVBoxLayout;   //主窗口使用的主布局
    QFormLayout *pf=new QFormLayout;   	pf->addRow(pl,pe);    	pf->addRow(pl1,pe1);
    QHBoxLayout *ph=new QHBoxLayout;    	ph->addWidget(pb3);    	ph->addWidget(pb4);
//把布局pf,ph和分离器,添加到主布局中
    pv->addLayout(ph);    pv->addLayout(pf);    pv->addWidget(ps);    setLayout(pv);
    QObject::connect(pe, &QLineEdit::returnPressed, this, &C::fSet);
    QObject::connect(pb3, &QPushButton::clicked, this, &C::fSave);
    QObject::connect(pb4, &QPushButton::clicked, this, &C::fRestore);
    QObject::connect(pe1, &QLineEdit::returnPressed, this, &C::f);
    QObject::connect(pe1, &QLineEdit::returnPressed, ps, &B::f);		}  //构造函数结束
public slots:
void fSet(){      				//使用setSizes函数设置分离器各子部件的大小
    		QString ss=pe->text();  	//获取行编辑器pe的文本
    		int j=0;   				//计数器
    		QString s1=ss;
   		QList<int> b;   			//使用列表存储从文本ss中提取出来的数字
    		while(!s1.isEmpty()){
    			s1=ss.section(",",j,j);	//提取以","分隔的数字。
    			b.append(s1.toInt());  	//把提取出来的数字追到加列表b的末尾。
    			j++;		}
    		if(b.size()<=3)   return;   //如果输入的数字个数少于3个,则退出函数。
    		ps->setSizes(b);  } 		//使用列表b设置各分离器子部件的位置
void fSave(){ b=ps->saveState();    cout<<"save OK"<<endl;}		//保存分离器的状态。
void fRestore(){    ps->restoreState(b);	}    				//恢复分离器的状态
    void f(){  B::ddd=pe1->text();   }};	//把行编辑器pe1输入的内容存储到静态变量B::ddd中
#endif // M_H

//m.cpp文件的内容

#include "m.h"
QString B::ddd;  //初始化静态变量,注意:静态变量不应在头文件中初始化,否则会出现重定义错误。
int main(int argc, char *argv[]){    QApplication a(argc,argv);
    		C w;    w.resize(300,500);        w.show();    return a.exec();  }

运行结果及说明见图5-42
在这里插入图片描述
示例5.20:QSplitter的嵌套使用(实现的界面如图5-43所示)
#include

int main(int argc, char *argv[]){    
QApplication a(argc,argv);
QWidget w;    
QSplitter *ps=new QSplitter(Qt::Vertical);
QSplitter *ps1=new QSplitter(Qt::Vertical);
QSplitter *ps2=new QSplitter(Qt::Horizontal);
QTextEdit *pt=new QTextEdit;    
QTextEdit *pt1=new QTextEdit;
QTextEdit *pt2=new QTextEdit;
//设置分界线的背景色及边框
    ps->setHandleWidth(1);   ps->setStyleSheet("QSplitter::handle{background-color: blue}");
    ps2->setFrameShadow(QFrame::Raised);    ps2->setFrameShape(QFrame::Box);
    ps2->setLineWidth(2);	    ps2->setHandleWidth(5);
    ps2->setStyleSheet("QSplitter::handle{background-color: red}");
//布局子部件
    ps->addWidget(pt);    	ps->addWidget(pt1);    	ps1->addWidget(pt2);
    ps2->addWidget(ps1);    	ps2->addWidget(ps);
    QHBoxLayout *ph=new QHBoxLayout;    ph->addWidget(ps2);    w.setLayout(ph);
    w.resize(300,200);        w.show();    return a.exec();  }

在这里插入图片描述

5.4.2 QSplitterHandle类(分界线)

QSplitterHandle类继承自QWidget,该类主要用于实现QSplitter(分离器)的分界线,因此,通常与分离器一起使用。该类的规则请参阅QSplitter类。
QSplitterHandle类比较简单,只有如下几个公有函数
在这里插入图片描述

示例5.21:QSplitterHandle(分界线)的使用
//m.h文件的内容

#ifndef M_H
#define M_H
#include<QtWidgets>
class B:public QSplitter{    Q_OBJECT
public:    B(Qt::Orientation o=Qt::Horizontal,QWidget* p=0):QSplitter(o,p){}
public slots:
    QSplitterHandle *createHandle(){    //重新实现该虚函数,创建自定义的分界线
        QSplitterHandle *ph=new QSplitterHandle(orientation(),this);   //自定义的分界线
        ph->setMinimumSize(22,22);             //设计分界线的最小大小
        return ph;            }}; 			//返回自定义的分界线
#endif // M_H

//m.cpp文件的内容

#include "m.h"
int main(int argc, char *argv[]){    QApplication a(argc,argv);
    QWidget w;    B *ps=new B(Qt::Vertical);
    QPushButton *pb=new QPushButton("AAA");    QPushButton *pb1=new QPushButton("BBB");
    QPushButton *pb2=new QPushButton("CCC");
    ps->addWidget(pb);    ps->addWidget(pb1);    ps->addWidget(pb2);
    ps->setStyleSheet("QSplitter::handle{background-color: red}");  //设置分界线的颜色(红色)
QHBoxLayout *ph=new QHBoxLayout;    ph->addWidget(ps);    w.setLayout(ph);
    w.resize(300,200);    w.show();    return a.exec();    }

运行结果及说明见图5-44

在这里插入图片描述
作者:黄邦勇帅(原名:黄勇)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QSplitter(分离器或分隔符) 的相关文章

  • Oracle 数据库审计

    保证数据库的安全有两种方式 一种是通过权限的存取控制机制 即通过预先控制来防止安全事件的发生 另一种是数据库审计 即对数据库活动做跟踪记录 当发生安全事件时 通过对数据库活动记录进行审计来发现并修复安全问题 Oracle使用大量不同的审计方
  • 用Python写个弹球的游戏

    原创 xinxin 菜鸟学Python 我们前面讲了几篇关于类的知识点 为了让大家更好的掌握类的概念 并灵活的运用这些知识 我写了一个有趣又好玩的弹球的游戏 一来可以把类的知识融会一下 二来加深对Python的兴趣 你会发现哎呀Python
  • eclipse Maven 插件添加第三方远程仓库

    方法一 在maven 配置文件setting xml 添加镜像点 mirror eclipse的 preferences gt maven gt User Settings 你就可以看到你的setting xml文件的地址 打开settin
  • SqueezeNet运用到Faster RCNN进行目标检测+OHEM

    目录 目录 一SqueezeNet介绍 MOTIVATION FIRE MODULE ARCHITECTURE EVALUATION 二SqueezeNet与Faster RCNN结合 三SqueezeNetFaster RCNNOHEM
  • unity出pc的包,然后想调试C#的dll咋办

    加入我们的逻辑代码是以dll的方式 放到unity项目中如下 namespace CSharpDll public class Utils public int Add int a int b int c a b return c publ
  • 2013全球移动游戏产业白皮书

    2013全球移动游戏产业白皮书 在全球移动游戏产业迅猛发展的背景下 中国移动游戏产业也进入了 高铁 时代 2013年 中国国内Android和iOS活跃设备量已达到3 7亿部 并涌现出20余款月流水超过千万元的 明星 移动游戏产品 对其内容
  • mysql数据库各种应用_MySQL数据库常见管理应用(1)

    MySQL数据库常见管理应用 1 创建数据库 创建一个数据库solin mysql gt create database solin 建立一个名为solin gbk的GBK字符集 mysql gt create database solin
  • Java通过反射获取注解以及注解中的信息

    首先自定义两个注解 1 用于描述表名 只能用在类 接口 枚举上 Target ElementType TYPE Retention RetentionPolicy RUNTIME public interface TableName Str
  • 《现代控制系统》第五章——反馈控制系统性能分析 5.3 二阶系统的性能

    现在我们看一个单环二阶系统的单位阶跃响应 一个闭环反馈控制系统如下图所示 已知该闭环系统的转换方程为 把受控系统的转换方程代入进去得到 如果给一个阶跃输入 那么 查拉普拉斯逆变换表我们得到时域输出为 其中 同时也是特征方程在s域的根与原点的
  • 实际项目二次封装axios------request.js和使用

    前言 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端 本质上也是对原生XHR的封装 只不过它是Promise的实现版本 符合最新的ES规范 在项目的实际开发中用到也比较多 这里我介绍一下实际开发中的基
  • 什么是高内聚、低耦合?

    起因 模块独立性指每个模块只完成系统要求的独立子功能 并且与其他模块的联系最少且接口简单 两个定性的度量标准 耦合性和内聚性 耦合性也称块间联系 指软件系统结构中各模块间相互联系紧密程度的一种度量 模块之间联系越紧密 其耦合性就越强 模块的
  • align-items属性

    弹性子元素在 侧轴 交叉轴上的对齐方式 align items stretch 默认值 如果弹性子元素没有高度或高度为auto 将占满整个容器的高度 align items flex start 子元素在侧轴顶端对齐 align items
  • CSS餐厅小游戏练习1~32关(附答案和链接)

    前言 CSS3众多基础常见的选择器都可以小游戏中学习 每天刷一遍 辅助记忆 做好熟练运用CSS3的第一步 小游戏链接 CSS3餐厅练习 玩法 利用各种选择器和选择器之间的关系选中抖动的物体即可通关 文章目录 第一关 Type Selecto
  • postgresql从入门到菜鸟(三)基本命令和窗口函数

    上一篇我们已经在rhel上创建了数据库 并且建立的一张成绩表 之后通过通过客户端连接上服务器端 这一篇将会写一些关于数据库的操作 首先是一些基本的操作的操作如选择数据库 查看表等等 连接至服务器端后可以通过以下命令查看数据库的基本信息 l
  • 记录element-plus + vue3.2 + tsx 开发时的问题

    开发时 select组件无法通过 model value v model value 设置值 查看了一下源码 image png https p1 juejin byteimg com tos cn i k3u1fbpfcp e1e92e6
  • 搞懂了Vue对象与实例的区别!

    很多人把Vue对象和Vue实例混为一谈 但它们还是有区别的 Vue构造函数就像一台智能手机的设计图纸 定义了这款手机的总体结构和组件 而每部依照设计图组装出来的真实手机 就是Vue实例 设计图上注明了屏幕尺寸 CPU型号等静态信息 对应Vu
  • vscode 自动导入包(组件)插件Auto Import安装好后,依旧没有自导导入提示的原因

    在TodoList js中 第一次用AntDesign的

随机推荐

  • Linux系统下搭建(更新)cuda环境

    本人之前ubuntu系统装的是cuda8 因为模型需要升级cuda 因此重新装cuda10 安装和更新cuda和cudnn以及安装和更新显卡驱动 下面操作都适合 一 安装 升级 显卡驱动 升级cuda之前 先要升级显卡驱动 登陆网页http
  • v-show切换显示隐藏失败

    最近在使用element ui时发现使用v show显示某一元素不生效 问题 当切换到日期维度时坐席中心并不会跟着改变 解决方法 将v show替换成v if 总结 v show是不支持template语法的 v if vs v show
  • MySQL分页查询慢怎么办

    今天看到一个问题 MySQL分页查询慢怎么办 第一反应是用limit限制返回的条数 比如 select from table order by idlimit 10 100 实际上我们限制的只是返回的条数是100 并不是查询时就从第10条开
  • java网络编程

    java网络编程 1 1 概述 1 2 网络通信的要素 如何实现网络通信 通信双方地址 地址ip 端口号 127 0 0 1 8080 OSI七层模型 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img w2Vt3r
  • 测试人遇到难以重现的bug,要怎么办?

    长时间做测试的人 自然也惹上了一堆毛病 譬如 这生了病不叫病 叫做bug 好了 发现bug了第一件事情 重现或者说确认开始了 摸了摸自己的胸口 恩 有点痛 但是又似乎是飘渺的 看来这还是一个难以重现的bug 作为一个资深的测试人员 我们是不
  • 2021斯坦福CS224N课程笔记~4

    4 依存解析 Dependency Parsing 参考文档 https zhuanlan zhihu com p 420736640 https www showmeai tech article detail 237 https zhu
  • 地鼠君黑盒测试--小白功能测试避雷经验分享

    测试计划 接到任务的第一时间 需要快速建档 准备测试计划 测试计划主要有几个侧重点 第一 该项目的截止时间和团队是否确定的阶段时间交付 第二 模块分析图 这一块由于公司小 缺少原型图 常常导致滞后产生 并且这一块花费的时间 笔者发现常常超时
  • centos7.5重启网络服务,网卡ip先显示后消失

    ip地址丢失不见 网卡报错 当重启网卡时 Job for network service failed because the control process exited with error code See systemctl sta
  • Qt+百度AI实现人脸识别之人脸检测

    文章目录 简单需求 Demo运行结果 百度AI人脸识别接入 为什么使用百度AI接口 接入步骤 如何获取Access Token Qt软件开发 人脸检测Qt编程步骤 知识点 网络编程 get put post请求方式的区别简述 POST 提交
  • Ubuntu开机启动项的增删改

    一 在重组系统 或者不想开机启动有太多的内核项显示 可以通过修改grub cfg内的内容进行更正 文件路径 boot grub grub cfg 二 grub cfg的详细内容 DO NOT EDIT THIS FILE It is aut
  • 特征选择之过滤式、包裹式、嵌入式

    常见的特征选择方法 特征选择 过滤式选择 包裹式选择 嵌入式选择 特征选择 从原始特征集合中选出对当前学习任务有用的最重要的一些特征 特征选择的原因 1 维度灾难 由于属性过多 导致维数灾难 若通过特征选择 则能大大减轻这一问题 2 降低学
  • 时序预测

    时序预测 MATLAB实现基于Adam算法优化BiLSTM双向长短期记忆神经网络时间序列预测 目录 时序预测 MATLAB实现基于Adam算法优化BiLSTM双向长短期记忆神经网络时间序列预测 效果一览 基本介绍 模型描述 程序设计 学习总
  • 一种罕见的代理程序自身引用死“锁”问题

    在使用sdkd 代理软件时 发现其他网页和程序都能联网 但是代理软件本身无法联网 排查 host dns 网卡 防火墙等 最后锁定在了系统变量上 发现由于之前在使用openai代码的时候设置了引用代理软件自身端口的系统变量 http pro
  • 手机访问静态html页面,手机访问电脑本地静态页面

    如果用webstrom打开一个单独的页面 在浏览器中现实的地址是 如果这恰好是你正在开发的用于移动端的页面 想要在手机上访问以便于测试验证效果 怎么访问到呢 在webstorm的setting中是有相关可设置的 只是我试了不好用 下面有几种
  • eclipse导入后将普通项目变为java项目

    eclipse用subclipse导入svn项目时 没有选择项目类型 这样就不能修改项目的buildpath no action aviliable 打开workspace下面的 projcet文件在标签
  • SparkSQL HiveSQL 常用正则表达式

    SparkSQL HiveSQL 常用正则表达式 目录 SparkSQL HiveSQL 常用正则表达式 1 匹配汉字 2 匹配手机号码 3 匹配身份证 4 SparkSQL HiveSQL 常用正则函数 5 SparkSQL 分组 聚合
  • 期待2021!

    好久没写文章了 甚至好久没有看文章了 要说这些天怎么过去了呢 恍恍惚惚 竟一时语塞 恍惚着 这2020竟马上过去了 好多好多人都写了分享了自己的年终总结 看了一些 大家好像都很有收获 再想想自己 也不能说没有任何收获 但是说不出来 最大的收
  • docker镜像服务器间复制

    概述 我们制作好镜像后 有时需要将镜像复制到另一台服务器使用 能达到以上目的有两种方式 一种是上传镜像到仓库中 本地或公共仓库 但是另一台服务器很肯能只是与当前服务器局域网想通而没有公网的 所以如果使用仓库的方式 只能自己搭建私有仓库 这会
  • SpringBoot+Dubbo分布式SOA项目骨架搭建(二)

    SpringBoot Dubbo分布式SOA项目骨架搭建 项目介绍 本项目是来自于上一篇文章http blog csdn net songxinjianqwe article details 77478385 中的服务化拆分这个部分 经过一
  • QSplitter(分离器或分隔符)

    QSplitter 分离器或分隔符 本文为原创文章 转载请注明出处 或注明转载自 黄邦勇帅 原名 黄勇 本文出自本人原创著作 Qt5 10 GUI完全参考手册 网盘地址 https pan baidu com s 1iqagt4SEC8PU