《QT实用小工具·五十四》果冻弹出效果的动画按钮

2024-05-05 19:36

本文主要是介绍《QT实用小工具·五十四》果冻弹出效果的动画按钮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、概述
源码放在文章末尾

该项目实现动画按钮,鼠标放在按钮上可以弹性拉出的三个按钮,使用贝塞尔曲线实现,项目demo显示如下所示:
在这里插入图片描述

项目部分代码如下所示:

#ifndef WATERCIRCLEBUTTON_H
#define WATERCIRCLEBUTTON_H#include <QObject>
#include <QWidget>
#include "interactivebuttonbase.h"class WaterCircleButton : public InteractiveButtonBase
{
public:WaterCircleButton(QWidget* parent = nullptr);WaterCircleButton(QIcon icon, QWidget* parent = nullptr);WaterCircleButton(QPixmap pixmap, QWidget* parent = nullptr);protected:void enterEvent(QEvent* event) override;void leaveEvent(QEvent* event) override;void mousePressEvent(QMouseEvent* event) override;void mouseReleaseEvent(QMouseEvent* event) override;void mouseMoveEvent(QMouseEvent* event) override;void resizeEvent(QResizeEvent* event) override;QPainterPath getBgPainterPath() override;QPainterPath getWaterPainterPath(Water water) override;void simulateStatePress(bool s = true);bool inArea(QPoint point) override;protected:QPoint center_pos;bool in_circle;int radius;
};#endif // WATERCIRCLEBUTTON_H
#include "watercirclebutton.h"WaterCircleButton::WaterCircleButton(QWidget* parent) : InteractiveButtonBase (parent), in_circle(false), radius(16)
{}WaterCircleButton::WaterCircleButton(QIcon icon, QWidget *parent) : InteractiveButtonBase (icon, parent), in_circle(false), radius(16)
{}WaterCircleButton::WaterCircleButton(QPixmap pixmap, QWidget *parent) : InteractiveButtonBase (pixmap, parent), in_circle(false), radius(16)
{}void WaterCircleButton::enterEvent(QEvent *event)
{}void WaterCircleButton::leaveEvent(QEvent *event)
{if (in_circle && !pressing && !inArea(mapFromGlobal(QCursor::pos()))){in_circle = false;InteractiveButtonBase::leaveEvent(event);}
}void WaterCircleButton::mousePressEvent(QMouseEvent *event)
{if (in_circle || (!hovering && inArea(event->pos())))return InteractiveButtonBase::mousePressEvent(event);
}void WaterCircleButton::mouseReleaseEvent(QMouseEvent *event)
{if (pressing){InteractiveButtonBase::mouseReleaseEvent(event);if (leave_after_clicked || (!inArea(event->pos()) && !pressing)) // 鼠标移出{in_circle = false;InteractiveButtonBase::leaveEvent(nullptr);}}
}void WaterCircleButton::mouseMoveEvent(QMouseEvent *event)
{bool is_in = inArea(event->pos());if (is_in && !in_circle)// 鼠标移入{in_circle = true;InteractiveButtonBase::enterEvent(nullptr);}else if (!is_in && in_circle && !pressing) // 鼠标移出{in_circle = false;InteractiveButtonBase::leaveEvent(nullptr);}if (in_circle)InteractiveButtonBase::mouseMoveEvent(event);
}void WaterCircleButton::resizeEvent(QResizeEvent *event)
{center_pos = geometry().center() - geometry().topLeft();radius = min(size().width(), size().height())/ 2;return InteractiveButtonBase::resizeEvent(event);
}QPainterPath WaterCircleButton::getBgPainterPath()
{QPainterPath path;int w = size().width(), h = size().height();QRect rect(w/2-radius, h/2-radius, radius*2, radius*2);path.addEllipse(rect);return path;
}QPainterPath WaterCircleButton::getWaterPainterPath(InteractiveButtonBase::Water water)
{QPainterPath path = InteractiveButtonBase::getWaterPainterPath(water) & getBgPainterPath();return path;
}void WaterCircleButton::simulateStatePress(bool s)
{in_circle = true;InteractiveButtonBase::simulateStatePress(s);in_circle = false;
}bool WaterCircleButton::inArea(QPoint point)
{return (point - center_pos).manhattanLength() <= radius;
}

源码下载

这篇关于《QT实用小工具·五十四》果冻弹出效果的动画按钮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962501

相关文章

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过