Qt应用开发(基础篇)——拆分器窗口 QSplitter QSplitterHandle
一、前言
QSplitter继承于QFrame,QFrame继承于QWidget,是Qt的一个部件容器工具类。
框架类QFrame介绍

QSplitter拆分器,用户通过拖动子部件之间的边界来控制子部件的大小,在应用开发中数据分模块展示、图片展示等场景下使用。

二、QSplitter类
1、childrenCollapsible
该属性表示用户是否可以将子部件的大小调整为0,默认为true,子节点是可折叠的。使用setCollapsible()来启用和禁用单个子节点的折叠。使用isCollapsible读取单个子节点的可折叠使能。
bool childrenCollapsible() const
void setChildrenCollapsible(bool)
bool isCollapsible(int index) const
void setCollapsible(int index, bool collapse)
2、handleWidth
该属性表示分离器手柄操作的宽度。
int handleWidth() const
void setHandleWidth(int)

3、opaqueResize
该属性表示在交互式移动拆分器时是否要动态调整小部件的大小,默认为true。
bool opaqueResize() const
void setOpaqueResize(bool opaque = true)

4、orientation
该属性表示分离器方向。
Qt::Orientation orientation() const
void setOrientation(Qt::Orientation)
5、公共方法
1)获取子部件数量
int count() const
2)增加子部件
使用addWidget()增加子部件,插入到尾部。
void addWidget(QWidget *widget)
3)插入子部件
使用insertWidget把子部件插入到指定的索引位置,如果索引位置超出范围,那么插入到尾部。
void insertWidget(int index, QWidget *widget)
4)查找子部件
使用indexOf()查找子部件所在的索引,如果不存在则返回-1。
int indexOf(QWidget *widget) const
5)替换子部件
使用replaceWdiget()替换某索引下的部件。如果索引index无效,那么返回一个null指针。
QWidget *replaceWidget(int index, QWidget *widget)
6)获取子部件
使用widget()传入索引返回部件指针,如果索引无效,则返回null指针。
QWidget *widget(int index) const
7)保存/恢复布局
使用saveState()保存当前布局状态,返回一个QbyteArray。
使用restoreState()传入saveState()返回的QbyteArray恢复布局状态,返回true,如果参数不合法,返回false。
QByteArray saveState() const
bool restoreState(const QByteArray &state)
8)保存/设置部件大小
使用size()返回子部件的高度/宽度。
使用setSizes()设置子部件的高度/宽度。如果是QSplitter横向布局则设置宽度,纵向布局则为设置高度。如果list的个数大于子部件个数,那么多余的将被忽略,如果是太少,那么设置失败。如果设置的尺寸加起来大于或者小于QSplitter的尺寸,那么将根据权重重新分配。
void setSizes(const QList<int> &list)
QList<int> sizes() const
9)设置子部件拉伸因子
使用setStretchFactor设置子部件的拉伸因子。
void setStretchFactor(int index, int stretch)
示例:
int index = 0;
int stretch = 1;
splitter->setStretchFactor(index,stretch);
//相当于
QWidget *widget = splitter->widget(index);
QSizePolicy policy = widget->sizePolicy();
policy.setHorizontalStretch(stretch);
policy.setVerticalStretch(stretch);
widget->setSizePolicy(policy);
10)获取手柄
返回分离器的手柄,手柄信息封装在QSplitterHandle中。
QSplitterHandle * handle(int index) const
6、信号
分离器手柄按下操作拉伸的时候触发。
void splitterMoved(int pos, int index)
三、QSplitterHandle类
QSplitter分离器创建之后,会自带一个QSplitterHandle手柄功能,QSplitterHandle继承于QWidget,所以可以使用重写paintEvent来自定义它的样式。
手柄提供了opaqueResize()和setOrientation()方法,用来读取和设置是否分离器滑动的时候动态调整部件大小,还有orientation()和setOrientation()方法,读取和设置分离器布局方向。
1、自定义分离器
自定义mySplitter和mySplitterHandle类,mySplitter重新实现createrHandle,mySplitterHandle重新实现paintEvent。

源码
//创建自定义QSplitter
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QTextEdit *pLeftEdit = new QTextEdit("left",this);QTextEdit *pTopEdit = new QTextEdit("top",this);QTextEdit *pBottomEdit = new QTextEdit("bottom",this);mySplitter *mainSpliter = new mySplitter(Qt::Horizontal,this);mySplitter *rightSpliter = new mySplitter(Qt::Vertical,this);mainSpliter->setHandleWidth(20);rightSpliter->setHandleWidth(20);rightSpliter->addWidget(pTopEdit);rightSpliter->addWidget(pBottomEdit);mainSpliter->addWidget(pLeftEdit);mainSpliter->addWidget(rightSpliter);mainSpliter->setFixedSize(QSize(500,400));mainSpliter->move(100,100);mainSpliter->setStretchFactor(0,1);mainSpliter->setStretchFactor(1,3);
}//重新实现QSplitter
QSplitterHandle *mySplitter::createHandle()
{return new mySplitterHandle(orientation(),this);
}
//重新实现QSplitterHandle
void mySplitterHandle::paintEvent(QPaintEvent *event)
{QPainter painter(this);QLinearGradient gradient;if (orientation() == Qt::Horizontal) {gradient.setColorAt(0, Qt::red);gradient.setColorAt(1, Qt::white);gradient.setStart(rect().left(), rect().height()/2);gradient.setFinalStop(rect().right(), rect().height()/2);} else {gradient.setColorAt(0, Qt::green);gradient.setColorAt(1, Qt::white);gradient.setStart(rect().width()/2, rect().top());gradient.setFinalStop(rect().width()/2, rect().bottom());}painter.fillRect(event->rect(), QBrush(gradient));
}
相关文章:
Qt应用开发(基础篇)——拆分器窗口 QSplitter QSplitterHandle
一、前言 QSplitter继承于QFrame,QFrame继承于QWidget,是Qt的一个部件容器工具类。 框架类QFrame介绍 QSplitter拆分器,用户通过拖动子部件之间的边界来控制子部件的大小,在应用开发中数据分模块展示、图片展示等场景下使用。 二、…...
屏幕尺寸单位 px、em、rem区别
1、px是屏幕设备物理上能显示出的最小的一个点,这个点不是固定宽度的,不同设备上点的长宽、比例有可能会不同。假设:1号显示器上1px宽1毫米,但2号显示器1px宽两毫米,那么定义一个div宽度为100px,1号显示器上…...
yo!这里是STL::list类简单模拟实现
目录 前言 重要接口实现 框架 默认成员函数 迭代器(重点) 1.引言 2.list迭代器类实现 3.list类中调用实现 增删查改 后记 前言 我们知道,stl中的vector对应数据结构中的顺序表,string类对应字符串,而今天要…...
小程序商城开发制作
当开发一个商城小程序时,费用是一个非常重要的考虑因素。然而,准确回答这个问题是有一定困难的,因为开发商城小程序的费用取决于多个因素。以下是一些可能影响价格的主要因素: 1. 功能需求:商城小程序的复杂程度和功能…...
并发编程面试题2
并发编程面试题2 一、AQS高频问题: 1.1 AQS是什么? AQS就是一个抽象队列同步器,abstract queued sychronizer,本质就是一个抽象类。 AQS中有一个核心属性state,其次还有一个双向链表以及一个单项链表。 首先state…...
关于eclipse导入部署具有增删改查的项目
目录 前言:当我们刚刚进入公司的第一步就是去部署当前公司的项目,本博客就是详细介绍怎么去部署当前公司的项目。 一,开发工具: 二,具体步骤: 2.1导入公司的项目 打开eclipse开发工具 2.2配置当前的环…...
c++日志工具之——log4cpp
1、log4cpp概述 Log4cpp是一个开源的C类库,它提供了C程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内…...
ES索引重建reindex详解
目录 一、使用场景 二、reindex介绍 三、使用手册 1、覆盖更新 2、创建丢失的文档并更新旧版本的文档 3、仅创建丢失的文档 4、冲突处理 5、source中添加查询条件 6、source中包含多个源索引 7、限制处理的记录数 8、从远程ES集群中重建索引 9、提取随机子集 10、…...
前沿分享-中距离射频取电
目前来看,微能源有四种技术路线,一是环境光采集、温差转换采集、无线射频采集和振动能量采集。 无线射频微能源是在通信设备通信过程中自然产生的,可以通过射频能量芯片实现无线射频取电,能瞬间大功率储电和安全驱动负载。 通过射…...
UnrealEngine - 网络同步之连接篇
1 连接过程 - 握手 传统的 C/S 架构下,Client 和 Server 通常会建立一条抽象的 Connection,用来进行两端的通信。 UE 的官方文档中提供了 Client 连接到 Server 的示例 ,简单来说分为如下几步: 打包构建好 Client 和 Server 进程…...
【JDBC系列】- 扩展提升学习
扩展提升学习 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正࿰…...
阻塞和非阻塞,同步和异步
文章目录 典型的一次IO的两个阶段IO多路复用是同步还是异步? 典型的一次IO的两个阶段 数据就绪和数据读写 同步:需要应用程序自己操作 IO多路复用是同步还是异步? epoll也是同步的 具体数据读取还是通过应用程序自己完成的 只有使用了特…...
提速Rust编译器!
Nethercote是一位研究Rust编译器的软件工程师。最近,他正在探索如何提升Rust编译器的性能,在他的博客文章中介绍了Rust编译器是如何将代码分割成代码生成单元(CGU)的以及rustc的性能加速。 他解释了不同数量和大小的CGU之间的权衡…...
QT创建项目
可选择CMake或qmake...
基于vue3+webpack5+qiankun实现微前端
一 主应用改造(又称基座改造) 1 在主应用中安装qiankun(npm i qiankun -S) 2 在src下新建micro-app.js文件,用于存放所有子应用。 const microApps [// 当匹配到activeRule 的时候,请求获取entry资源,渲染到containe…...
华为OD真题--完美走位--带答案
2023华为OD统一考试(AB卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 题目描述 输入一个长度为4的倍数的字符串Q,字符串中仅包含WASD四个字母。 将这个字符串中的连续子串…...
【AI】《动手学-深度学习-PyTorch版》笔记(十四):多层感知机
AI学习目录汇总 1、多层感知机网络结构 1.1 线性模型:softmax回归 在前面介绍过,使用softmax回归来处理分类问题时,每个输出通过都一个仿射函数计算,网络结构如下,输入和输出之间为全链接层: 1.2 多层感知机 多层感知机就是在输入和输出中间再添加一个或多个全链接…...
本地开发 npm 好用的http server、好用的web server、静态服务器
好用的web server总结 有时需要快速启动一个web 服务器(http服务器)来伺服静态网页,安装nginx又太繁琐,那么可以考虑使用npm serve、http-server、webpack-dev-server。 npm serve npm 的serve可以提供给http server功能&#…...
Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)
应用链接: https://979427749bc9ceec34.gradio.live 是公开访问链接,3天有效。 在modelscope中的创空间发布长期有效:https://modelscope.cn/studios/wuyoy520v01/MindOpt_Chicken-with-rabbit-cage/summary。 应用图如下,源代码见正文。 知…...
redis核心知识点简略笔记
value数据类型 string 二进制安全 list 有序、可重复 set 无序、不重复 hash field-value的map sorted set 不重复、通过double类型score分数排序 场景 string 计数器缓存分布式锁访问频率控制分布式session hash 购物车等对象属性灵活修改 list 定时排行榜 set 收藏 sorte…...
Android Studio Layout Inspector 保姆级使用指南:从进程选取到设计图对比,一个功能都不落
Android Studio Layout Inspector 全功能实战手册:从基础操作到高级调试技巧 在Android应用开发过程中,UI布局的调试和优化占据了开发者大量时间。Layout Inspector作为Android Studio内置的强大工具,远不止是一个简单的视图查看器ÿ…...
Day03:Function Calling 核心
文章目录一、Function Calling 核心概念与定义1.1 技术本质与原理1.2 与传统 AI 推理的区别1.3 主要技术实现框架二、Function Calling 的核心价值与解决的问题2.1 解决知识截止问题2.2 解决实时数据获取需求2.3 解决外部动作执行问题2.4 安全性与可控性设计三、Function Calli…...
【LaTeX实战】跨越语言障碍:精准处理参考文献中的俄文与西班牙文人名
1. 当LaTeX遇上多语言人名:问题诊断与场景还原 第一次在LaTeX文档里遇到俄文人名"Дмитрий"编译失败时,我盯着报错信息发了半小时呆。学术写作本就够头疼了,参考文献里突然冒出的西里尔字母更是让人崩溃。这种情况太常见了—…...
别再死记硬背了!用‘网络拓扑’和‘交换技术’的故事,5分钟搞懂计算机网络核心概念
用‘拓扑家族’和‘快递员’的故事,5分钟解锁计算机网络核心逻辑 想象一下,如果计算机网络中的设备能开口说话,星形拓扑的中心交换机可能会抱怨:"每天处理这么多请求,我的CPU都要冒烟了!"而总线拓…...
RocketMQ新手避坑:启动Broker时指定conf文件,解决connect to 172.17.42.1:10911 failed
RocketMQ连接错误深度解析:从172.17.42.1:10911失败到完美解决 第一次接触RocketMQ时,那种兴奋感很快被一连串的错误信息冲淡。记得那天深夜,我盯着屏幕上刺眼的"connect to 172.17.42.1:10911 failed"错误,反复检查每一…...
避开这3个坑,你的OpenCV Python项目运行效率能快一倍
OpenCV Python性能优化实战:避开这3个效率黑洞 在计算机视觉项目的开发过程中,性能瓶颈往往隐藏在看似无害的代码片段里。当你的视频处理流水线开始卡顿,或是内存占用莫名飙升时,问题可能源于一些容易被忽视的编码习惯。本文将深入…...
别再踩坑了!MyBatis-Plus分页失效?可能是你的PaginationInnerInterceptor没配对
MyBatis-Plus分页插件深度解析:从失效排查到最佳实践 遇到MyBatis-Plus分页查询结果异常?别急着怀疑人生,这很可能是插件配置的"版本陷阱"在作祟。自从3.4版本架构调整后,原先直来直去的PaginationInterceptor配置方式…...
ABAP ALV删除行后数据又‘复活’?一个方法搞定check_changed_data
ABAP ALV删除行数据同步异常排查指南:从Del键失效到check_changed_data的深度解析 在SAP系统开发中,可编辑ALV报表的数据同步问题堪称"经典陷阱"。许多开发者都遇到过这样的场景:用户信心满满地按下Del键删除行项目,点击…...
从一道笔试题看Java内存模型:String s = new String(“abc“) 到底创建了几个对象?
从一道笔试题看Java内存模型:String s new String("abc") 到底创建了几个对象? 在Java开发者的技术面试中,关于字符串对象创建的问题几乎成了必考题。这道看似简单的题目背后,隐藏着Java内存模型(JMM&#…...
解码NR(三):5G Type I 码本(codebook)的数学原理与波束赋形
1. 5G Type I码本的基础概念 想象一下你在一个嘈杂的会议室里,想要让对面的人听清你说的话。你会怎么做?很自然地,你会把手拢在嘴边,让声音朝着特定方向传播。这就是波束赋形(Beamforming)最朴素的理解——通过控制信号的发射方向…...
