Qt实现可伸缩的侧边工具栏(鼠标悬浮控制伸缩栏)

news2025/1/15 19:36:53

Qt实现可伸缩的侧边工具栏

一直在网上找,发现大多的实现方案都是用一个按钮,按下控制侧边栏的伸缩,但是我想要实现鼠标悬浮在侧边栏的时候就伸出,移开就收缩的功能,也没找到好的参考,所以决定自己实现一个,只在C++代码里面就可以实现了,不需要用到qss。


效果演示

代码也是功能演示Demo,用了显眼的颜色来突出功能。实际用的时候需要继续完善加入到项目中。
在这里插入图片描述


实现方法

  1. 首先看看我的主界面UI

在这里插入图片描述
可以看到我就是用了一个水平布局,布局里就放置黄色和红色两个QWidget,然后黄色的作为侧边栏(黄色里面的布局不用管他,只是用来布局侧边栏里面的功能键),然后红色的不会去动他。

  1. 给黄色的QWidget使用重写悬浮事件来控制伸缩

需要先用到语句给黄色侧边栏开启悬浮事件判断

 ui->widget->setAttribute(Qt::WA_Hover, true);

在主窗口类里需要重写两个事件(待会再写具体实现),分别是

protected:
1. bool eventFilter(QObject* obj, QEvent* event);
2. void resizeEvent(QResizeEvent* event);

然后要给黄色侧边栏加载主窗口的事件,才能用到在主窗口类中重写的事件

ui->widget->installEventFilter(this);
  1. 重写事件,在事件中使用QPropertyAnimation来控制伸缩动画

在主窗口类中先声明一个私有变量QPropertyAnimation* propertyAnimation提供给事件调用。再声明一个布尔值bool sideFlag = true来表示当前侧边栏的伸缩状态。

  • 在主窗口构造函数中初始化propertyAnimation
propertyAnimation = new QPropertyAnimation(ui->widget, "geometry");
propertyAnimation->setEasingCurve(QEasingCurve::InOutQuint);
propertyAnimation->setDuration(200);
  • 重写事件resizeEvent:
void QtApplication::resizeEvent(QResizeEvent* event)
{
    width = ui->widget->width();				//width和height都是主窗口类的私有变量
    height = ui->centralWidget->height();
    propertyAnimation->setStartValue(QRect(-1, 0, 10, height));		//参数代表左,上,右,下坐标
    propertyAnimation->setEndValue(QRect(-1, 0, width, height));
}

这一步是为了重新设置当前窗口下的伸缩的起点和重点位置坐标。这一步是难点:在布局下的widget的长度和宽度都是经过改变的,不在resize事件下重新获取widget的长度和宽度,只会得到最初始的无布局下的widget的长度和宽度,简单的说不是正确的数据,需要在resizeEvent下或者paintEvent下“在程序运行后”“延后地”获取widget的长度和宽度才是正确的尺寸数据。

  • 重写事件eventFilter:
bool QtApplication::eventFilter(QObject* obj, QEvent* event)
{
    if (obj == ui->widget)
    {
        if (event->type() == QEvent::HoverEnter)	//鼠标进入黄色侧边栏中悬浮,正向播动画
        {
            propertyAnimation->setDirection(QAbstractAnimation::Forward);
            propertyAnimation->start();
            return true;
        }
        else if (event->type() == QEvent::HoverLeave) //鼠标离开黄色侧边栏,反向播动画
        {
            propertyAnimation->setDirection(QAbstractAnimation::Backward);
            propertyAnimation->start();
            return false;
        }
    }
    return QWidget::eventFilter(obj, event);
}

实现逻辑不难,可以理解上述内容后自己写出来就行,最关键的点就是获取widget的width和height一定要准确! 在这点上我摸了很久,后面总算在resizeEvent中成功获取到了准确的数据。

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

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

相关文章

Apache Kafka Learning

一、Kafka Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以收集并处理用户在网站中的所有动作流数据以及物联网设备的采样信息。 Apache Kafka是Apache软件基金会的开源的流…

Quartz使用文档,使用Quartz实现动态任务,Spring集成Quartz,Quartz集群部署,Quartz源码分析

文章目录 一、Quartz 基本介绍二、Quartz Java 编程1、文档2、引入依赖3、入门案例4、默认配置文件 三、Quartz 重要组件1、Quartz架构体系2、JobDetail3、Trigger(1)代码实例(2)SimpleTrigger(3)CalendarI…

低代码开发工具到底是给“谁”用的?

不同的工具,受众也不一样。 你不要认为“低代码开发工具”只有一种,实际上它分 3 种。 第一种:企业级低代码开发平台 这种通常是给专业开发人员使用的,但也没有限制得很死,只要你懂编程逻辑,能写sql语句&…

[数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北

MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据&#x…

微信云开发-数据库操作

文章目录 前提初始化数据库插入数据查询数据获取一条数据获取多条数据查询指令 更新数据更新指令 删除数据总结 前提 首先有1个集合(名称:todos). 其中集合中的数据为: {// 计划描述"description": "learn mini-program cloud service",// 截止日期"…

阿里云OSS的开通+配置及其使用

云存储解决方案-阿里云OSS 文章目录 云存储解决方案-阿里云OSS1. 阿里云OSS简介2. OSS开通(1)打开https://www.aliyun.com/ ,申请阿里云账号并完成实名认证。(2)充值 (可以不用做)(3)开通OSS&am…

小程序云开发快速入门(2/4)

前言 我们对《微信小程序云开发快速入门(1/4)》的知识进行回顾一下。在上章节我们知道了云开发的优势以及能力,并且我们还完成了码仔备忘录的本地版到网络版的改造,主要学习了云数据库同时还通过在小程序使用云API直接操作了云数…

选读SQL经典实例笔记16_逻辑否定

1. 示例数据 1.1. student insert into student values (1,AARON,20) insert into student values (2,CHUCK,21) insert into student values (3,DOUG,20) insert into student values (4,MAGGIE,19) insert into student values (5,STEVE,22) insert into student values (6…

Java内存溢出的排查工具和方法

JVM内存溢出事故回顾 JVM内存溢出的排查方法个工具介绍 事故回顾 • 9:58收到报警,资讯延时1小时。 • 10:10排查出接口全部超时,超时时间2s。 • 去运维那边执行jstat发现元空间沾满了,疯狂fgc。 • 执行jmap -dump 并下载。 • 使用MAT分…

VLAN原理+配置

目录 一, 以太网二层交换机 二,三层架构: 三,VLAN配置思路 1.创建vlan 2.接口划入vlan 3.trunk干道 4.vlan间路由器 5.DHCP池塘配置 四,华为VLAN部分的接口模式讲解: 五,华为VLAN部分的…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

阿里云出品—高分计算机好书推荐榜

1、云原生架构白皮书 云原生是一种构建和运行应用程序的方法,它能实现构建应用简便快捷,部署应用轻松自如,越来越多公司和个人选择使用云原生技术。《云原生架构白皮书》作为业界首本全方位构建云原生架构规划与实践全景图的白皮书&#xff…

【牛客】统计字符

⭐️ 题目描述 🌟 OJ链接:HJ40 统计字符 ps: 判断字符可以直接使用头文件自带的函数。 函数作用iscntrl判断是否为控制字符isspace判断是否为空白字符(空格、换页’\f’、换行’\n’、回车’\r’、制表符’\t)isdigi…

「应用实时监控 ARMS 」斩获「根因分析技术」先进级认证

阿里云云原生可观测 ARMS 率先斩获「根因分析技术」先进级认证 7 月 25 日,由中国信通院发起的“2023 可信云-系统稳定性”首批评估结果在可信云大会现场公布,应用实时监控服务 ARMS 斩获《可观测性标准体系要求 - 根因分析技术分级能力要求》“先进级”…

Pytorch深度学习之余弦退火学习率设置

1. 什么是余弦退火学习率? 余弦退火学习速率调度是改进深度神经网络学习过程的常用方法。当深度神经网络在大型数据集上训练时,它尤其有用,因为在大型数据集中,学习过程可能会陷入局部极小值。在训练过程中,学习率以不…

OpenMMLab【超级视客营】——把类别信息加入可视化结果中(MMSegmentation的第二个PR)

文章目录 1. 任务说明1.0 新手指引1.1 任务目标1.2 提交格式 2. 实施2.1 可视化的形式2.2 拉分支和提交PR2.2.1 拉分支2.2.2 提交PR 2.3 MMSegmentation中关于可视化的内容2.3.1 文档说明2.3.2 相关PR(确定要修改的文件)2.3.3 提交时的代码测试 2.4 发现…

java实现5种不同的验证码图片,包括中文、算式等,并返回前端

导入以下依赖 <!--图片验证码--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> 编写controller package com.anXin.user.controlle…

Tessy 4.3.18

Tessy 4.3.18 windows 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

【无标题】uniapp引入萤石云 真机无法运行 踩坑集合

Uniapp 接入萤石云 踩坑 1.先用了 UIKit Javascript 就是在 pc端 那套流程 npm install ezuikit-jsimport EZUIKit from ezuikit-js;这套流程貌似只适用于pc端&#xff0c;我在接入uniapp的时候没看官网 以为都是一套流程&#xff0c;然后就在uniapp中也来了这一套&#xff0…

vue+neo4j(neo4j desktop安装和使用)

vueneo4j&#xff08;neo4j desktop安装和使用&#xff09; 本文目录 vueneo4j&#xff08;neo4j desktop安装和使用&#xff09;官网下载安装基本使用创建项目新增数据库连接数据库 使用cypher构建简单知识图谱创建节点创建关系删除节点及关系查询节点和关系 数据导出为json文…