QT6 源(45):分隔条 QSplitter 允许程序的用户修改布局,程序员使用 IDE时,就是分隔条的用户,以及其 QSplitter 源代码

(1)

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

(2)本类的继承关系如下,所以说分隔条属于容器

在这里插入图片描述

(3)本类的属性

在这里插入图片描述

(4) 这是一份 QSplitter 的举例代码,注意其构造函数时候的传参

#ifndef UI_WIDGET_H
#define UI_WIDGET_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QFrame>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QSplitter>
#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACEclass Ui_Widget
{
public:QHBoxLayout * horizontalLayout;QSplitter   * splitter;QFrame      * frame;QFrame      * frame_2;void setupUi(QWidget *Widget){if (Widget->objectName().isEmpty())Widget->setObjectName(QString::fromUtf8("Widget"));Widget->resize(523, 339);horizontalLayout = new QHBoxLayout(Widget); //为主窗体采用水平布局horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));splitter = new QSplitter(Widget); //对,生成的是水平分隔条。本分割条属于本窗体容器。splitter->setObjectName(QString::fromUtf8("splitter"));splitter->setOrientation(Qt::Horizontal);frame = new QFrame(splitter);frame->setObjectName(QString::fromUtf8("frame"));frame->setFrameShape(QFrame::StyledPanel);frame->setFrameShadow(QFrame::Plain);frame->setLineWidth(2);splitter->addWidget(frame); //把左 frame 添加入 splitter//继承关系上, splitter 才扩充了添加窗体的方法frame_2 = new QFrame(splitter);frame_2->setObjectName(QString::fromUtf8("frame_2"));frame_2->setFrameShape(QFrame::StyledPanel);frame_2->setFrameShadow(QFrame::Plain);frame_2->setLineWidth(2);splitter->addWidget(frame_2); //把右 frame 添加入 splitterhorizontalLayout->addWidget(splitter); //把分隔条 splitter 添加到主窗体的布局中//可见,分隔条相当于容器,隐身的容器;也相当于布局,可以接收子容器,还可以被放入布局中retranslateUi(Widget);QMetaObject::connectSlotsByName(Widget);} // setupUivoid retranslateUi(QWidget *Widget){Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));} // retranslateUi};namespace Ui {class Widget: public Ui_Widget {};
} // namespace UiQT_END_NAMESPACE#endif // UI_WIDGET_H

(5)给出源代码,来自于头文件 qsplitter . h

#ifndef QSPLITTER_H
#define QSPLITTER_H#include <QtWidgets/qtwidgetsglobal.h>
#include <QtWidgets/qframe.h>
#include <QtWidgets/qsizepolicy.h>/*
QT_CONFIG宏实现了对 Qt特性的安全编译时检查。特性可以处于三种状态:
0 或未定义:在测试时会引发编译错误
-1:该功能不可用
1:该功能可用The QT_CONFIG macro implements a safe compile time check for features of Qt.Features can be in three states:0 or undefined: This will lead to a compile error when testing for it-1: The feature is not available1: The feature is available
*/
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1,\"Required feature " #feature " for file " __FILE__ " not available.")QT_REQUIRE_CONFIG(splitter); //条件编译,确保有了此源代码模块QT_BEGIN_NAMESPACE  //说明本类定义在 QT 的全局空间class QSplitterPrivate;
class QTextStream;class QSplitterHandle;//    class QLayout : public QObject, public QLayoutIte
//    class QWidget : public QObject, public QPaintDevice
//class QFrame : public QWidget
//一个分割器允许用户通过拖动它们之间的边界来控制子控件的大小。
//任何数量的控件都可以由一个单一的分割器控制。
//如果在调用 insertWidget()或addWidget()时,一个部件已经在 QSplitter中,
//它将移动到新位置。这可以用于稍后重新排序 splitter中的部件。
//可以使用indexOf()、widget()和count()来访问splitter 中的部件。
//默认的QSplitter将其子元素水平排列(并排);
//您可以使用setOrientation(Qt::Vertical)将其子元素垂直排列。
//默认情况下,所有小部件都可以像用户希望的那样大或小,
//介于小部件的minimumSizeHint()(或minimumSize())和maximumSize()之间。
//默认情况下,QSplitter会动态调整其子项的大小。
//如果您希望QSplitter仅在调整大小操作结束时调整子项的大小,请调用setOpaqueResize(false)。
//小部件之间初始大小的分布是通过将初始大小与拉伸因子相乘来确定的。
//您还可以使用setSizes()来设置所有小部件的大小。函数sizes()返回由用户设置的大小。
//或者,您可以使用saveState()和restoreState()分别保存和恢复小部件的大小。
//当你隐藏(hide)一个子元素时,它的空间将被分配到其他子元素中。当你再次显示(show)它时,它将被恢复。
class Q_WIDGETS_EXPORT QSplitter : public QFrame
{Q_OBJECT //又插入了此宏//此属性保存了分割器的方向.//默认情况下,方向是水平(即小部件是并排排列的)。可能的方向是Qt::Horizontal和Qt::Vertical。Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)//如果分隔条在交互式移动时动态(不透明)地重新调整大小,则返回true。否则返回 false。//默认的缩放行为取决于样式(由SH_Splitter_OpaqueResize样式提示确定)。//但是,您可以通过调用setOpaqueResize()来覆盖它。Q_PROPERTY(bool opaqueResize READ opaqueResize WRITE setOpaqueResize)//不透明//此属性包含分隔符手柄的宽度。即被分隔条隔开的内部各控件之间的间距。//默认情况下,此属性包含一个值,该值取决于用户的平台和样式偏好。//如果您将 handleWidth 设置为1或0,则实际抓取区域将增长到与其各自的小部件重叠几个像素Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth)//这个属性表示子控件是否可以被用户缩小到0的大小。默认情况下,子元素是可折叠的。//使用setCollapsible()方法可以启用或禁用单个子元素的折叠。Q_PROPERTY(bool childrenCollapsible //倒塌;垮塌;可折叠 collapseREAD childrenCollapsible WRITE setChildrenCollapsible)private:Q_DISABLE_COPY(QSplitter)Q_DECLARE_PRIVATE(QSplitter)
private:friend class QSplitterHandle;public://构造一个水平分割器,将 parent参数传递给 QFrame构造函数。explicit QSplitter(QWidget * parent = nullptr); //本组件属于 parent容器explicit QSplitter(Qt::Orientation, QWidget * parent = nullptr);//Constructs a splitter with the given orientation and parent.~QSplitter();//Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation)Qt::Orientation orientation() const;void         setOrientation(Qt::Orientation); //方向就是水平或垂直两种//Q_PROPERTY(bool opaqueResize READ opaqueResize WRITE setOpaqueResize)bool    opaqueResize() const;void setOpaqueResize(bool opaque = true);//Q_PROPERTY(int handleWidth READ handleWidth WRITE setHandleWidth)int     handleWidth() const;void setHandleWidth(int);//Q_PROPERTY(bool childrenCollapsible
//           READ childrenCollapsible WRITE setChildrenCollapsible)bool    childrenCollapsible() const;void setChildrenCollapsible(bool);//Returns true if the widget at index is collapsible, otherwise returns false.bool  isCollapsible(int index) const;void setCollapsible(int index, bool);//Sets whether the child widget at index is collapsible to collapse.//默认情况下,子项是可折叠的,这意味着用户可以将它们的大小缩小到大小0,//即使它们具有非零的minimumSize()或minimumSizeHint()。//可以通过调用此函数在每个 widget的基础上更改此行为,//也可以通过设置 childrencollapsible 属性为拆分器中的所有 widget 全局更改此行为。//返回此拆分器中所有小部件的大小参数的列表。//如果拆分器的方向是水平,则列表包含从左到右的像素宽度;//如果方向是垂直的,则列表包含从顶部到底部的像素高度。//将值传递给另一个分块器的 setSizes()函数将产生一个布局与此相同的分块器。QList<int>   sizes() const; //本函数的返回值是一个链表容器void      setSizes(const QList<int> &list);//将子控件的相应大小设置为列表中给出的值。//如果分隔线是水平的,则值以像素为单位设置每个小部件的宽度,从左到右。//如果分隔线是垂直的则设置每个小部件的高度,从上到下。//列表中的额外值将被忽略。如果列表包含太少的值,结果是不确定的,但程序仍然会表现得很好。//分割器组件的整体大小不受影响。相反,任何额外的/缺失的空间将根据尺寸的相对权重在组件之间分配。//如果您指定大小为0,则小部件将不可见。//小部件的大小策略将被保留。也就是说小于相应小部件的最小大小提示值的值将被提示值替换。//保存分割器的布局状态。//通常,这用于与QSettings一起使用,以记住未来会话的大小。版本号作为数据的一部分存储。QByteArray    saveState() const;bool       restoreState(const QByteArray &state);//Restores the splitter's layout to the state specified.//Returns true if the state is restored; otherwise returns false.QSize        sizeHint() const override;QSize minimumSizeHint() const override;//Returns the valid range of the splitter at index in *min and *max//if min and max are not 0.void getRange(int index, int *min, int *max) const;//Returns the number of widgets contained in the splitter's layout.int count() const;int indexOf(QWidget *w) const;QWidget *        widget(int index) const; //!!扩充了添加窗体的方法,就类似于 Qlayout了void          addWidget(QWidget *widget);void       insertWidget(int index, QWidget *widget);QWidget * replaceWidget(int index, QWidget *widget);void refresh(); //不要调用本函数//Updates the splitter's state. You should not need to call this function.//Updates the size policy of the widget at position index to//have a stretch factor of stretch.//stretch 并不是有效的拉伸因子;有效的拉伸因子是通过取小部件的初始大小并//将其乘以 stretch 计算得出的  。void setStretchFactor(int index, int stretch);//返回分割器布局中给定索引处左侧(或上方)的项的句柄,//如果不存在这样的项则返回nullptr。索引为0的句柄总是隐藏的。//对于像阿拉伯语和希伯来语这样的右至左语言,水平分隔符的布局是颠倒的。在索引处的控件右侧是手柄。QSplitterHandle         *       handle(int index) const;
protected:virtual QSplitterHandle * createHandle();//返回一个新的分隔符处理程序作为此分隔符的子控件。//此函数可以在子类中重新实现,以提供对自定义处理程序的支持。bool       event(QEvent *) override;void  childEvent(QChildEvent *) override;void resizeEvent(QResizeEvent *) override;void changeEvent(QEvent *) override;//在位置 pos 显示橡皮筋 RubberBand。如果 pos是负数,则移除皮筋。void setRubberBand(int position);int  closestLegalPosition(int pos, int index);//Returns the closest legal position to pos of the widget at index.//对于阿拉伯语和希伯来语等从右向左的语言,水平分隔符的布局//是颠倒的。然后从小部件的右边缘测量位置。//将分割器手柄的左边缘或顶部边缘在索引 index 处移动到尽可能靠近位置pos的位置,//位置pos是从小部件的左边缘或顶部边缘的距离。void moveSplitter(int pos, int index);Q_SIGNALS: //信号函数void     splitterMoved(int pos, int index);//当 index 索引处的分路器手柄移动到位置 pos 时,会发出此信号。
}; //完结 class QSplitter : public QFrameclass QSplitterHandlePrivate;//当人们想到分割器时,通常会想到QSplitterHandle。它是用于调整部件大小的控制柄。
//使用 QSplitter的典型开发人员永远不必担心 QSplitterHandle。
//它提供给那些想要提供额外功能(如弹出菜单)的分割器处理程序的开发人员。
//创建分割器处理程序的典型方法是子类化QSplitter,然后重写QSplitter::createHandle()以
//实例化自定义分割器处理程序。
class Q_WIDGETS_EXPORT QSplitterHandle : public QWidget
{Q_OBJECT
public:explicit QSplitterHandle(Qt::Orientation o, QSplitter *parent);~QSplitterHandle();void setOrientation(Qt::Orientation o);Qt::Orientation orientation() const;bool opaqueResize() const;QSplitter *splitter() const;QSize sizeHint() const override;protected:void paintEvent(QPaintEvent *) override;void mouseMoveEvent(QMouseEvent *) override;void mousePressEvent(QMouseEvent *) override;void mouseReleaseEvent(QMouseEvent *) override;void resizeEvent(QResizeEvent *) override;bool event(QEvent *) override;void moveSplitter(int p);int closestLegalPosition(int p);private:Q_DISABLE_COPY(QSplitterHandle)Q_DECLARE_PRIVATE(QSplitterHandle)
};QT_END_NAMESPACE#endif // QSPLITTER_H

(6)

谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSCode PIO使用Jlink SWD烧录Stm32

一、背景 PIO的编译速度比Arduino快很多&#xff0c;同样支持Arduino的语法。VScode的自动补全和插件也能够帮助快速开发目前使用JLINK SWD的方式连接STM32 二、配置 在ini配置文件中&#xff0c;添加如下内容 [env:genericSTM32F103C8] platform ststm32 board genericS…

JavaScript 渲染内容爬取:Puppeteer 入门

在现代网络应用中&#xff0c;许多网页内容是通过 JavaScript 渲染生成的&#xff0c;传统的爬虫工具往往难以获取这些动态内容。Puppeteer 作为一种强大的浏览器自动化工具&#xff0c;为这一问题提供了优雅的解决方案。本文将带你入门 Puppeteer&#xff0c;介绍如何安装、启…

卷积神经网络:视觉炼金术士的数学魔法

引言&#xff1a;当数学遇见视觉炼金术 在人工智能的奇幻世界里&#xff0c;卷积神经网络&#xff08;CNN&#xff09;犹如掌握视觉奥秘的炼金术士&#xff0c;将原始像素的"铅块"淬炼成认知的"黄金"。这种融合数学严谨性与生物灵感的算法架构&#xff0c…

Android Cordova 开发 - Cordova 快速入门(Cordova 环境配置、Cordova 第一个应用程序)

一、Cordova 1、Cordova 概述 Cordova 是使用 HTML&#xff0c;CSS 和 JavaScript 构建混合移动应用程序的平台 2、Cordova 特征 &#xff08;1&#xff09;命令行界面&#xff08;Cordova CLI&#xff09; 这是可用于启动项目&#xff0c;构建不同平台的进程&#xff0c;…

ubuntu18.04启动不了修复

参考: 虚拟机里的Ubuntu18.4启动时进入到grub rescue救援模式&#xff08;无法正常进入到系统&#xff09;&#xff0c;ls查看后只有一个硬盘和分区&#xff0c;且无法找到/boot/grub文件【已解决】_ubuntu grub rescue-CSDN博客 本人fdisk错误使用,导致了grub启动不了 第一步…

SpringBoot3设置maven package直接打包成二进制可执行文件

注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package&#xff08;注意&#xff1a;使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…

【华为】防火墙双击热备-之-主备模式-单外网线路

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…

MYSQL之表的操作

1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名, datatype 表示列的类型character set 字符集, 如果没有指定字符集, 则以所在数据库的字符集为…

RAG进阶:Chroma开源的AI原生向量数据库

一、Chroma 核心概念与优势 1. 什么是 Chroma&#xff1f; Chroma 是一款开源的向量数据库&#xff0c;专为高效存储和检索高维向量数据设计。其核心能力在于语义相似性搜索&#xff0c;支持文本、图像等嵌入向量的快速匹配&#xff0c;广泛应用于大模型上下文增强&#xff0…

店匠科技摘得 36 氪“2025 AI Partner 创新大奖”

全场景 AI 方案驱动跨境电商数智化跃迁 4 月 18 日,36 氪 2025 AI Partner 大会于上海盛大开幕。大会紧扣“Super App 来了”主题,全力探寻 AI 时代的全新变量,探索 AI 领域下一个超级应用的无限可能性。在此次大会上,跨境电商独立站 SaaS 平台店匠科技(Shoplazza)凭借“店匠跨…

SQL技术终极指南:从内核原理到超大规模应用

一、DDL核心应用场景与最佳实践 1.1 表结构设计场景矩阵 业务场景核心语法要素典型实现案例电商用户画像JSON字段虚拟列索引CREATE TABLE users (id INT, profile JSON, AS (profile->>$.age) VIRTUAL, INDEX idx_age((profile->>$.age)))物联网时序数据分区表压…

吴恩达深度学习作业CNN之ResNet实现(Pytorch)

课程中认识许多CNN架构。首先是经典网络&#xff1a; LeNet-5AlexNetVGG 之后是近年来的一些网络&#xff1a; ResNetInceptionMobileNet 经典网络 LeNet-5 LeNet-5是用于手写数字识别&#xff08;识别0~9的阿拉伯数字&#xff09;的网络。它的结构如下&#xff1a; 网络…

FPGA入门学习Day1——设计一个DDS信号发生器

目录 一、DDS简介 &#xff08;一&#xff09;基本原理 &#xff08;二&#xff09;主要优势 &#xff08;三&#xff09;与传统技术的对比 二、FPGA存储器 &#xff08;一&#xff09;ROM波形存储器 &#xff08;二&#xff09;RAM随机存取存储器 &#xff08;三&…

SqlSugar与Entity Framework (EF)的SWOT分析

以下是基于 SWOT 分析法 对 SqlSugar 和 Entity Framework (EF) 的特性对比&#xff1a; SqlSugar 优势 (Strengths) 高性能&#xff1a; SqlSugar 以轻量化设计著称&#xff0c;执行速度更快&#xff0c;适合对性能要求较高的场景。在大数据量操作和复杂查询中表现优异。 易…

学习记录:DAY16

Maven 进阶与前端实战 前言 二轮考核的内容下来了&#xff0c;由整体项目构建转为实现特定模块的功能。对细节的要求更高了&#xff0c;而且有手搓线程池、手搓依赖注入等进阶要求&#xff0c;又有得学力。嘻嘻&#xff0c;太简单了&#xff0c;只要我手搓 Spring Boot 框架……

深度学习--卷积神经网络调整学习率

文章目录 前言一、学习率1、什么学习率2、什么是调整学习率3、目的 二、调整方法1、有序调整1&#xff09;有序调整StepLR(等间隔调整学习率)2&#xff09;有序调整MultiStepLR(多间隔调整学习率)3&#xff09;有序调整ExponentialLR (指数衰减调整学习率)4&#xff09;有序调整…

【消息队列RocketMQ】四、RocketMQ 存储机制与性能优化

一、RocketMQ 存储机制详解 1.1 存储文件结构​ RocketMQ 的存储文件主要分布在store目录下&#xff0c;该目录是在broker.conf配置文件中通过storePathRootDir参数指定的&#xff0c;默认路径为${user.home}/store 。主要包含以下几种关键文件类型&#xff1a;​ 1.1.1 Comm…

C++入门小馆: 探寻vector类

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

CSS-跟随图片变化的背景色

CSS-跟随图片变化的背景色 获取图片的主要颜色并用于背景渐变需要安装依赖 colorthief获取图片的主要颜色. 并丢给背景注意 getPalette并不是个异步方法 import styles from ./styles.less; import React, { useState } from react; import Colortheif from colorthief;cons…

RAGFlow:构建高效检索增强生成流程的技术解析

引言 在当今信息爆炸的时代&#xff0c;如何从海量数据中快速准确地获取所需信息并生成高质量内容已成为人工智能领域的重要挑战。检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术应运而生&#xff0c;它将信息检索与大型语言模型&#xff08;L…