Qt实现一个悬浮工具箱源码分享
一、效果展示
二、源码分享
hoverToolboxWidget.h
#ifndef HOVERTOOLBOXWIDGET_H
#define HOVERTOOLBOXWIDGET_H#include <QWidget>
#include <QMouseEvent>
#include <QPropertyAnimation>
#include <QStyleOption>
#include <QPainter>namespace Ui {
class HoverToolboxWidget;
}class HoverToolboxWidget : public QWidget
{Q_OBJECT
signals:void btnClickSlot(QString fun);
public:explicit HoverToolboxWidget(QWidget *parent = nullptr);~HoverToolboxWidget();
protected:void paintEvent(QPaintEvent *event) override;bool eventFilter(QObject *obj,QEvent *event) override;
private:void controlInit();void extand();
private:Ui::HoverToolboxWidget *ui;bool isDragging = false,isExtending = false;QPointF dragPos;QPropertyAnimation *amplifyAnimation,*leaveAnimation;static const uint8_t cellSize = 75;
};#endif // HOVERTOOLBOXWIDGET_H
hoverToolboxWidget.cpp
#include "hoverToolboxWidget.h"
#include "ui_hoverToolboxWidget.h"HoverToolboxWidget::HoverToolboxWidget(QWidget *parent): QWidget(parent), ui(new Ui::HoverToolboxWidget)
{ui->setupUi(this);this->controlInit();
}HoverToolboxWidget::~HoverToolboxWidget()
{delete ui;
}
void HoverToolboxWidget::controlInit()
{setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);setAttribute(Qt::WA_TranslucentBackground, true);this->ui->labelImage->installEventFilter(this);this->ui->labelImage->setMouseTracking(true);this->ui->frame->installEventFilter(this);this->ui->frame->setMouseTracking(true);this->ui->pushButton1->hide();this->ui->pushButton2->hide();this->ui->pushButton3->hide();this->ui->pushButton4->hide();this->ui->pushButton5->hide();this->ui->pushButton6->hide();this->ui->pushButton7->hide();this->ui->pushButton8->hide();this->resize(cellSize,cellSize);this->setAttribute(Qt::WA_StyledBackground, true);connect(this->ui->pushButton1,&QPushButton::clicked,this,[=](){emit btnClickSlot("openRootDir");});connect(this->ui->pushButton1,&QPushButton::clicked,this,[=](){emit btnClickSlot("screenShot");});
}void HoverToolboxWidget::extand()
{if(!isExtending){auto pos = this->pos();int x = pos.x()-cellSize-this->ui->frame->layout()->spacing();int y = pos.y()-cellSize-this->ui->frame->layout()->spacing();int wh = cellSize*3 + this->ui->frame->layout()->spacing()*2 + this->ui->labelImage->pos().x()*2;this->setGeometry(x,y,wh,wh);this->ui->pushButton1->show();this->ui->pushButton2->show();this->ui->pushButton3->show();this->ui->pushButton4->show();this->ui->pushButton5->show();this->ui->pushButton6->show();this->ui->pushButton7->show();this->ui->pushButton8->show();//判断有没有超出边界int jx = this->pos().x();int jy = this->pos().y();if(jx < 0)jx = 0;if(jx+this->width() > this->parentWidget()->width())jx = this->parentWidget()->width()-this->width();if(jy < 0)jy = 0;if(jy + this->height() > this->parentWidget()->height())jy = this->parentWidget()->height() - this->height();this->move(jx,jy);isExtending = true;this->ui->labelImage->setPixmap(QPixmap(":/image/image/toolboxOpen.svg"));}
}void HoverToolboxWidget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QStyleOption option;option.initFrom(this);QPainter painter(this);style()->drawPrimitive(QStyle::PE_Widget, &option, &painter, this);
}bool HoverToolboxWidget::eventFilter(QObject *obj, QEvent *event)
{if(obj == this->ui->labelImage){if(event->type() == QEvent::MouseButtonPress){QMouseEvent *ev = dynamic_cast<QMouseEvent *>(event);if (ev->button() == Qt::LeftButton){isDragging = true;dragPos = ev->globalPosition() - frameGeometry().topLeft();}if (ev->button() == Qt::RightButton){this->extand();}}else if(event->type() == QEvent::MouseMove){QMouseEvent *ev = dynamic_cast<QMouseEvent *>(event);if (isDragging){QPointF movePoint = ev->globalPosition() - dragPos;int x = movePoint.x();int y = movePoint.y();if(x < 0)x = 0;if((x+this->width()) > this->parentWidget()->width())x = this->parentWidget()->width() - this->width();if(y < 0)y = 0;if((y+this->height()) > this->parentWidget()->height())y = this->parentWidget()->height() - this->height();this->move(x,y);}}else if(event->type() == QEvent::MouseButtonRelease){QMouseEvent *ev = dynamic_cast<QMouseEvent *>(event);if (ev->button() == Qt::LeftButton) {isDragging = false;}}else if(event->type() == QEvent::MouseButtonDblClick){this->extand();}}else if(obj == this->ui->frame){if(event->type() == QEvent::Leave){if(isExtending){isExtending = false;auto pos = this->pos();this->ui->pushButton1->hide();this->ui->pushButton2->hide();this->ui->pushButton3->hide();this->ui->pushButton4->hide();this->ui->pushButton5->hide();this->ui->pushButton6->hide();this->ui->pushButton7->hide();this->ui->pushButton8->hide();int x = pos.x()+cellSize + this->ui->frame->layout()->spacing();int y = pos.y()+cellSize + this->ui->frame->layout()->spacing();this->setGeometry(x,y,cellSize,cellSize);this->ui->labelImage->setPixmap(QPixmap(":/image/image/toolboxClose.svg"));}}}return QWidget::eventFilter(obj,event);
}
相关文章:

Qt实现一个悬浮工具箱源码分享
一、效果展示 二、源码分享 hoverToolboxWidget.h #ifndef HOVERTOOLBOXWIDGET_H #define HOVERTOOLBOXWIDGET_H#include <QWidget> #include <QMouseEvent> #include <QPropertyAnimation> #include <QStyleOption> #include <QPainter>namespa…...

线夹金具测温在线监测装置:电力设备安全运行的“隐形卫士”
在电网系统中,线夹金具是连接导线与输电塔架的关键部件,其运行状态直接影响电力传输的稳定性。传统人工巡检方式存在效率低、盲区多、数据滞后等问题,而线夹金具测温在线监测装置的普及,正为电力设备运维带来革新。 一、工作原理&…...

《TCP/IP 详解 卷1:协议》第4章:地址解析协议
ARP 协议 地址解析协议(ARP, Address Resolution Protocol)是IPv4协议栈中一个关键的组成部分,用于在网络层的IP地址与数据链路层的硬件地址(如MAC地址)之间建立映射关系。它的主要任务是: 将32位的IPv4地…...
Dify 离线升级操作手册(适用于无外网企业内网环境)
一、准备工作 准备一台能访问互联网的外网机器 用于拉取最新的 Dify 镜像和代码建议使用 Linux 或 Windows Docker 环境 准备传输介质 U盘、移动硬盘,或企业内部网络共享路径 确认当前内网 Dify 版本和配置 确认版本号,备份配置文件和数据库 二、外…...

Windows下运行Redis并设置为开机自启的服务
下载Redis-Windows 点击redis-windows-7.4.0下载链接下载Redis 解压之后得到如下文件 右键install_redis.cmd文件,选择在记事本中编辑。 将这里改为redis.windows.conf后保存,退出记事本,右键后选择以管理员身份运行。 在任务管理器中能够…...

网络编程之网络基础
基础理论:IP、子网掩码、端口号、字节序、网络基础模型、传输协议 socket:TCP、UDP、广播、组播、抓包工具的使用、协议头、并发服务器 Modbus协议 、HTTP协议、HTML、 分析服务器 源码、数据库 一、认识网络 网络:实现多设备通信 二、IP地址…...

Spring AI(11)——SSE传输的MCP服务端
WebMVC的服务器传输 支持SSE(Server-Sent Events) 基于 Spring MVC 的服务器传输和可选的STDIO运输 导入jar <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</a…...

计算机网络备忘录
计算机网络 - 网络互联与互联网 计算机网络重点学习本章,属于核心知识 包含网络层和传输层 的 相关协议 计算机网络层次重点掌握网络层与传输层。其中网络层主要是IP协议,解决主机-主机通信,传输层主要是TCP/UDP 协议,解决应用-…...

Spring Boot论文翻译防丢失 From船长cap
本文内容 微服务 微服务风格的特性组件化(Componentization )与服务(Services)围绕业务功能的组织产品不是项目强化终端及弱化通道分散治理分散数据管理基础设施自动化容错性设计设计改进 微服务是未来吗其它 微服务系统多大微…...
[蓝桥杯]最优包含
最优包含 题目描述 我们称一个字符串 SS 包含字符串 TT 是指 TT 是 SS 的一个子序列,即可以从字符串 SS 中抽出若干个字符,它们按原来的顺序组合成一个新的字符串与 TT 完全一样。 给定两个字符串 SS 和 TT,请问最少修改 SS 中的多少个字符…...

NuxtJS入门指南:环境安装及报错解决
在学习NuxtJS的过程中,正确的安装环境是非常重要的一步。然而,有时候在安装过程中会遇到一些问题,比如使用corepack安装pnpm时出现的错误。本文将详细介绍如何安装NuxtJS以及解决上述安装过程中遇到的问题。 Nuxt.js简介 Nuxt.js是一个强大的…...
在java 项目 springboot3.3 中 调用第三方接口(乙方),如何做到幂等操作(调用方为甲方,被调用方为乙方)? 以及啥是幂等操作?
什么是幂等操作? 幂等性(Idempotence) 是指一个操作无论执行一次还是多次,对系统状态产生的影响都是相同的。在分布式系统中,由于网络不稳定、超时重试等因素,接口可能被重复调用,幂等设计能确…...

贪心算法应用:集合划分问题详解
贪心算法与集合划分问题详解 集合划分问题是组合优化中的经典问题,其核心目标是将元素集合划分为若干满足特定条件的子集。本文将深入探讨贪心算法在集合划分中的应用,涵盖算法原理、适用场景、Java实现细节及优化策略。 一、集合划分问题定义 1.1 基础…...
electron下载文件
const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下载文件函数 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(开始下载…...
Neo4j 数据导入:原理、技术、技巧与最佳实践
在构建知识图谱、社交网络分析或复杂关系系统时,高效准确地将数据导入Neo4j图数据库至关重要。本文基于官方文档,深入探讨Neo4j数据导入的核心原理、主流技术、实用技巧及行业最佳实践。 Neo4j的数据导入不仅是技术操作,更是图模型设计的延续。深入理解存储原理、灵活运用C…...

数论~~~
质数 质数Miller-Rabin算法质因子分解质数筛埃氏筛欧拉筛如果只是计数,埃氏筛改进 快速幂乘法快速幂矩阵快速幂1维k阶实战(提醒:最好在mul函数中作乘法时加上(long long)的强制类型转换 ,或者全部数组换成long long&am…...

web第十次课后作业--Mybatis的增删改查
(一)删除操作 功能:根据主键删除数据 SQL 语句 -- 删除id17的数据 delete from emp where id 17;Mybatis 框架让程序员更关注于 SQL 语句 接口方法 Mapper public interface EmpMapper {//Delete("delete from emp where id 17&qu…...

贪心算法应用:集合覆盖问题详解
贪心算法与集合覆盖问题详解 贪心算法在组合优化问题中展现出独特优势,集合覆盖问题(Set Cover Problem)是其中的经典案例。本文将用2万字全面解析贪心算法在集合覆盖/划分中的应用,涵盖算法原理、正确性分析、Java实现、复杂度证…...
BLOB 是用来存“二进制大文件”的字段类型
BLOB 是用来存“二进制大文件”的字段类型,可以存 0 到 65535 字节的数据,常用来存图片、音频、PDF、Word 等“非文本”内容。 BLOB 0-65535 bytes 二进制形式的长文本数据✅ 关键词 1:BLOB 全称:Binary Large Object中文&…...
5.Declare_Query_Checking.ipynb
这个教程 5.Declare_Query_Checking.ipynb 主要讲解了如何使用 DECLARE 查询检查器来分析事件日志中的约束关系。 1. 主要功能 这个教程展示了如何使用 DeclareQueryChecker 来: 发现事件日志中满足特定支持度的约束模式查询不同类型的约束关系分析活动之间的关联…...

【知识点】第7章:文件和数据格式化
文章目录 知识点整理文件概述文件的打开和关闭文件的读操作文件的写操作 练习题填空题选择题 知识点整理 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象,类似地,函…...

NetSuite Bundle - Dashboard Refresh
儿童节快乐! 今朝发一个Bundle,解决一个NetSuite Dashboard的老问题。出于性能上的考虑,NetSuite的Dashboard中的Portlet,只能逐一手工刷新。有人基于浏览器做了插件,可以进行自动刷新。但是在我们做项目部署时&#…...
AI+3D 视觉重塑塑料袋拆垛新范式:迁移科技解锁工业自动化新高度
在工业自动化浪潮席卷全球的当下,仓储物流环节的效率与精准度成为企业降本增效的关键战场。其中,塑料袋拆垛作为高频、高重复性的作业场景,传统人工或机械臂操作面临着诸多挑战。迁移科技,作为行业领先的 3D 工业相机和 3D 视觉系…...

智慧赋能:移动充电桩的能源供给革命与便捷服务升级
在城市化进程加速与新能源汽车普及的双重推动下,移动充电桩正成为能源供给领域的一场革命。传统固定充电设施受限于布局与效率,难以满足用户即时、灵活的充电需求,而移动充电桩通过技术创新与服务升级,打破了时空壁垒,…...
【项目实践】SMBMS(Javaweb版)(三)登出、注册、注销、修改
文章目录 登出、注册、注销、修改登出操作的实现逻辑及方式防止用户登出后可以继续访问修改密码功能实现导入jsp实现Dao层数据接口实现Service层业务接口注册Servlet 注册和注销 用户的方式导入jsp实现Dao层的数据逻辑实现Service逻辑注册Servlet 登出、注册、注销、修改 登出…...
斐波那契数列------矩阵幂法
斐波那契数列 斐波拉楔数是我们在学递归的使用看到的题目,但递归法是比较慢的,后面我们用循环递进来写的,但今天我有遇到了新的方法—— 矩阵幂法(线性代数的知识点)。 矩阵幂法: F11*F10*F2; F20*F11*…...
【Go语言基础【四】】局部变量、全局变量、形式参数
文章目录 一、一句话总结二、作用域分类1. 局部变量(函数内/块内变量)1.1、语法说明1.2、示例 2. 全局变量(包级变量)2.1、语法说明2.2、示例:全局变量的访问 3. 形式参数(函数参数) 三、作用域…...
DeepSeek 赋能车路协同:智能交通的破局与重构
目录 一、引言二、智能交通车路协同系统概述2.1 系统定义与原理2.2 系统构成2.3 发展现状与挑战 三、DeepSeek 技术剖析3.1 DeepSeek 简介3.2 核心技术原理3.2.1 Transformer 架构3.2.2 混合专家架构(MoE)3.2.3 多头潜在注意力(MLA࿰…...
RabbitMQ 的异步化、解耦和流量削峰三大核心机制
RabbitMQ 的异步化、解耦和流量削峰三大核心机制 RabbitMQ 是解决数据库高并发问题的利器,通过异步化、解耦和流量削峰三大核心机制保护数据库。下面从设计思想到具体实现,深入剖析 RabbitMQ 应对高并发的完整方案: 一、数据库高并发核心痛点…...
Ubuntu 25.10 将默认使用 sudo-rs
非盈利组织 Trifecta Tech Foundation 报告,Ubuntu 25.10 将默认使用它开发的 sudo-rs——用内存安全语言 Rust 开发的 sudo 实现。 Ubuntu 25.10 代号 Questing Quokka,预计将于 2025 年 10 月释出,是一个短期支持版本。Sudo-rs 是 Trifect…...