Qt应用开发(基础篇)——拆分器窗口 QSplitter QSplitterHandle

news2025/1/10 3:30:11

一、前言

        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));
}

 

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

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

相关文章

Nuxt.js--》解锁 Nuxt 项目的潜力:从配置开始,迈向成功

博主今天开设Nuxt.js专栏&#xff0c;带您深入探索 Nuxt.js 的精髓&#xff0c;学习如何利用其强大功能构建出色的前端应用程序。我们将探讨其核心特点、灵活的路由系统、优化技巧以及常见问题的解决方案。无论您是想了解 Nuxt.js 的基础知识&#xff0c;还是希望掌握进阶技巧&…

FastDFS安装教程

FastDFS安装 软件下载 需要的软件&#xff1a;fastdfs-6.0.4、libfastcommon-1.0.42、fastdfs-nginx-module-1.22.tar.gz 下载地址 安装 fastdfs是使用c语言写的&#xff0c;需要先配置c语言环境。 yum install -y gcc gcc-cyum install libevent安装libfastcommon函数库…

Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数若干空…

Win7累积补丁更新包_UpdatePack7R2-23.8.10

UpdatePack7是最新的Win7补丁累积更新包&#xff0c;Windows 7更新补丁安装包&#xff0c;Win7累积更新离线安装包包括所有关键更新和安全更新及Internet Explorer所有版本的更新&#xff0c;此外还集成了NVMe驱动和USB3.0驱动&#xff0c;使用它还可以将累积更新封装到系统内&…

通过BitMap实现签到

针对黑马点评。 bitmap签到 在传统的签到系统中的数据库的表一般都采取直接存储的形式&#xff0c;类似于一种记录表&#xff0c;但是如果用户的数量特别大&#xff0c;签到上几个月之后&#xff0c;这种表的数据量特别大&#xff0c;同时&#xff0c;存储的数据也会占用很多…

大汇总!各省杰青优青名单已出炉

【SciencePub学术】杰青&#xff0c;是国家杰出青年基金项目资助获得者的简称&#xff0c;与科技奖励计划类似&#xff0c;是我国重要的人才计划之一。一所学校的杰青数量&#xff0c;代表学校未来的学术发展潜力和在同类高校的学术地位&#xff0c;每所大学都非常看重。今年部…

Lombok的使用及注解含义

文章目录 一、简介二、如何使用2.1、在IDEA中安装Lombok插件2.2、添加maven依赖 三、常用注解3.1、Getter / Setter3.2、ToString3.3、NoArgsConstructor / AllArgsConstructor3.4、EqualsAndHashCode3.5、Data3.6、Value3.7、Accessors3.7.1、Accessors(chain true)3.7.2、Ac…

C++笔记之if(指针)的含义

C笔记之if(指针)的含义 code review! 文章目录 C笔记之if(指针)的含义例1例2 例1 例2

突然断电CAD图纸没保存怎么恢复?

CAD图纸绘制时&#xff0c;有时会遇到一些意外情况&#xff0c;比如突然断电、电脑意外关机或者软件异常退出&#xff0c;但是图纸还没保存&#xff0c;这该怎么办&#xff1f;这对于设计师来说&#xff0c;简直要崩溃&#xff0c;不仅白干一天&#xff0c;还得加班赶进度&…

【果树农药喷洒机器人】Part6:基于深度相机与分割掩膜的果树冠层体积探测方法

文章目录 一、引言二、树冠体积测量对比方法2.1冠层体积人工测量法2.2冠层体积拟合测量法 三、基于深度相机与分割掩膜探测树冠体积方法3.1像素值与深度值的转换3.2树冠体积视觉探测法3.3实验分析 总结 一、引言 果树靶标探测是实现农药精准喷施的关键环节&#xff0c;本章以果…

2. Hello World

Hello World 我们将用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印 出来的消费者。我们将介绍 Java API 中的一些细节。 在下图中&#xff0c;“ P”是我们的生产者&#xff0c;“ C”是我们的消费者。中间的框是一个队列-RabbitMQ 代 表使用者保留的消息缓冲区 …

RS-232标准

目录 1、概述2、RS-232接口的特点3、RS-232接口协议【仿真】 1、概述 RS-232接口是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换…

Spring5新功能

文章目录 前言一、整合日志功能二、Nullable注解三、函数式风格编程四、JUnit5单元测试框架总结 前言 整合日志、Nullable注解、函数式风格编程、整合JUnit5、Webflux 一、整合日志功能 Spring5移除了Log4jConfigListener&#xff0c;官方建议使用Log4j2. 依赖&#xff1a; &…

期权定价模型系列【2】—期权的希腊字母计算及应用

本篇文章旨在介绍期权常见希腊字母的计算及应用 本专栏更多侧重于理论及文字方面的展示&#xff0c;文章具体的代码可以参考我的另一个专栏【期权量化】。 【期权量化】专栏有同名文章&#xff0c;并且给出了文章的具体代码。 专栏地址&#xff1a; http://t.csdn.cn/Y30Hk…

计算机竞赛 LSTM的预测算法 - 股票预测 天气预测 房价预测

0 简介 今天学长向大家介绍LSTM基础 基于LSTM的预测算法 - 股票预测 天气预测 房价预测 这是一个较为新颖的竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

吉他谱:Melodies of Life - Final Fantasy Solo Guitar Collections

原始出处&#xff1a; Final Fantasy Solo Guitar Collections - 南泽大介改编的最终幻想9主题曲吉他谱 更多吉他谱&#xff1a; https://github.com/NaisuXu/Guitar_Sheet_Music_Collection

警惕360.勒索病毒,您需要知道的预防和恢复方法。

引言&#xff1a; 近年来&#xff0c;勒索病毒已经成为网络安全的一大威胁&#xff0c;其中之一就是以 “360 勒索病毒 ” 为名的恶意软件。这种病毒通过加密用户的数据文件&#xff0c;并要求赎金以解密这些文件&#xff0c;给受害者带来了严重的损失和困扰。本文91数据恢复将…

【正点原子STM32连载】第三章 开发环境搭建摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第三…

【脚踢数据结构】队列(顺序和链式)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

JVM内存区域

预备 为了更好的理解类加载和垃圾回收&#xff0c;先要了解一下JVM的内存区域&#xff08;如果没有特殊说明&#xff0c;都是针对的是 HotSpot 虚拟机。&#xff09;。 Java 源代码文件经过编译器编译后生成字节码文件&#xff0c;然后交给 JVM 的类加载器&#xff0c;加载完…