类模板实现实现Qt click/hover自定义操作
一、场景
常常会需要实现点击/hover时修改图片,可能是一个QPushButton、QLabel、QToolButton……
由于Qt bug,QIcon/QSS只能实现常规态、按下态的图标切换,hover态的图片设置无效。
解决思路无非是安装事件过滤器、自定义类并重实现事件。
然而,总要为这些鸡毛蒜皮的操作“小动干戈”会让人不爽。
这里选择更通用的类模板来简化操作。
二、实现说明
-
Q_OBJECT不能在类模板中使用,导致我们不能在模板类中设置信号。不过也不是刚需,上面的场景回调函数足够用了。 -
如果一定要使用信号,那么就要用一个类来代理信号的发送。
比如下面定义了InteractiveSignalSender,只用于发送信号。
绑定时信号发送者需要调getSignalSender()注意,只能通过组合的方式。如果通过多继承的方式,例如让模板类继承
QObject,会出现重复继承QObject(因为WidgetType也继承自QObject),QObject不支持多重继承,会有问题。 -
如果需要在Qt Deigner中使用,需要提升,那么可以单独写个头文件来放入模板实例,例如:
// InteractivePushButton.h #pragma once #include "interactiveTemplate.h"using InteractivePushButton = Interactive<QPushButton>;然后添加该头文件,选择提升为
InteractivePushButton即可。
三、实现
使用例子:
ui.btnFeedback->setEnterCallback([&] { ui.btnFeedback->setIcon(QIcon(":/img/hover.png")); });
ui.btnFeedback->setLeaveCallback([&] { ui.btnFeedback->setIcon(QIcon(":/img/simple.png")); });
ui.btnFeedback->setClickCallback([&] { ui.btnFeedback->setIcon(QIcon(":/imgpressed.png")); });connect(ui.btnFeedback->signalSender(), &InteractiveSignalSender::signalEnter, this, [] {});
模板实现如下:
InteractiveTemplate.h
#pragma once#include <QWidget>class InteractiveSignalSender : public QObject {Q_OBJECT
public:explicit InteractiveSignalSender(QObject *parent) : QObject(parent){}Q_SIGNALS:void signalEnter();
Q_SIGNALS:void signalLeave();
};template <typename WidgetType>
class Interactive : public WidgetType {
public:explicit Interactive(QWidget *parent = nullptr);void setEnterCallback(std::function<void()> callback);void setLeaveCallback(std::function<void()> callback);void setClickCallback(std::function<void()> callback);InteractiveSignalSender *signalSender();protected:void mousePressEvent(QMouseEvent *event) override;void enterEvent(QEvent *event) override;void leaveEvent(QEvent *event) override;
private:std::function<void()> m_enterCallback = nullptr;std::function<void()> m_leaveCallback = nullptr;std::function<void()> m_clickCallback = nullptr;InteractiveSignalSender *m_signalSender = new InteractiveSignalSender(this);static_assert(std::is_base_of<QWidget, WidgetType>::value, "WidgetType must be a QWidget");
};template <typename WidgetType>
Interactive<WidgetType>::Interactive(QWidget *parent) : WidgetType(parent)
{
}template <typename WidgetType>
InteractiveSignalSender *
Interactive<WidgetType>::signalSender()
{return m_signalSender;
}template <typename WidgetType>
void
Interactive<WidgetType>::setEnterCallback(std::function<void()> callback)
{m_enterCallback = callback;
}template <typename WidgetType>
void
Interactive<WidgetType>::setLeaveCallback(std::function<void()> callback)
{m_leaveCallback = callback;
}template <typename WidgetType>
void
Interactive<WidgetType>::setClickCallback(std::function<void()> callback)
{m_clickCallback = callback;
}template <typename WidgetType>
void
Interactive<WidgetType>::mousePressEvent(QMouseEvent *event)
{if (m_clickCallback) {m_clickCallback();}WidgetType::mousePressEvent(event);
}template <typename WidgetType>
void
Interactive<WidgetType>::enterEvent(QEvent *event)
{emit m_signalSender->signalEnter();if (m_enterCallback) {m_enterCallback();}WidgetType::enterEvent(event);
}template <typename WidgetType>
void
Interactive<WidgetType>::leaveEvent(QEvent *event)
{emit m_signalSender->signalLeave();if (m_leaveCallback) {m_leaveCallback();}WidgetType::leaveEvent(event);
}相关文章:
类模板实现实现Qt click/hover自定义操作
一、场景 常常会需要实现点击/hover时修改图片,可能是一个QPushButton、QLabel、QToolButton…… 由于Qt bug,QIcon/QSS只能实现常规态、按下态的图标切换,hover态的图片设置无效。 解决思路无非是安装事件过滤器、自定义类并重实现事件。 …...
Arco Design:引领未来的Vue 3创意先锋,一键开启高效与美感并重的Web开发之旅!
Arco Design 是一个基于 Vue 3 的 UI 框架,它提供了丰富的组件和样式,可以帮助开发者快速构建高质量的 Web 应用程序。以下是 Arco Design 的一些详细特点: 完整的设计系统:Arco Design 提供了一套完整的设计系统,包括…...
【MySQL】Linux下用C/C++链接MySQL数据库
文章目录 一、准备工作二、验证库和接口的使用三、链接数据库四、对数据库进行增删查改增删改查 五、结尾 一、准备工作 要使用C链接数据库, 首先要去MySQL官网下载官网提供的库, MySQL 社区下载. 如图所示: 接着选择: 按需选择版本: 如果用的是云服务器, 那么在安装mysql时…...
Python金融量化专栏简介
量化分析实战 - 专栏大纲 👉👉👉 《玩转Python金融量化专栏》👈👈👈 订阅本专栏的可以下载对应的代码和数据集 专栏目标 本专栏旨在帮助读者全面掌握使用Python进行金融技术指标的计算与应用,从基础到高级,涵盖各种技术指标的实现、策略开发与回测等内容。通过…...
出行365:依托分布式数据库,让出行无忧 | OceanBase案例
*本文首发自“新华社环球”杂志,作者张海鑫 每年的暑期旅游旺季,都会触发一轮轮的文旅消费的热潮,对于互联网出行服务行业而言,这既是一场盛大的狂欢,也是对其综合实力的严峻考验。 然而,自去年暑假起&…...
【C语言】位段详解
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、什么是位段? 二、…...
LVS集群实验
NAT模式 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发RIP和DIP应在同一个IP网络,且应使用私网地址:RS的网关要指向DIP请求报文和响应报文都必须经由Direclor转发,Direclor易于成为系统瓶…...
在 Spring Boot 中使用适配器模式实现支付网关的统一接口
引言 在许多电子商务系统中,集成多个支付网关是常见的需求。不同的支付网关有着不同的接口和实现细节。适配器模式可以帮助我们以一种灵活的方式实现这些不同的支付网关接口。 适配器模式简介 适配器模式将一个类的接口转换为客户期望的另一个接口。适配器模式使…...
【书生·浦语大模型实战营】第三期 入门岛作业
入门岛作业 Linux闯关任务:完成 SSH 连接与端口映射并运行 hello_world.py。配置vscode作业内容 可选任务1:将Linux基础命令在开发机上完成一遍作业内容 可选任务 2:使用 VSCODE 远程连接开发机并创建一个conda环境作业内容 可选任务 3&#…...
Redis的String类型常用命令总结
1. set 设置一个键的值。 set key value示例: set username "alice"2. get 获取一个键的值。 get key示例: get username3. getset 设置键的值,并返回键的旧值。 getset key value示例: getset username "…...
河南萌新联赛2024第(四)场:河南理工大学
A 思路: B 思路:有一种贪心的写法,将整个数组排序以后比较两个相邻数的同或值,取 m a x max max,不会证明 int th(int x, int y, int z) {int res 0;for (int i z - 1; i > 0; i --) {int dx (x >> i &…...
Linux中临时使用账号提权进行业务操作
普通账号提权 su:永久提权 Switching users with su sudo:临时提权 Running commands as root with sudo 1)su切换账号 需要对方的密码 示例:切换到超级管理员 su - root 建议用-这个 su root 普通用户需要执行特殊指令&…...
lwip 3. 网线拔掉后 lwip_recvfrom不能返回
当网线被拔掉后,LWIP的lwip_recvfrom函数无法返回,这通常意味着网络连接已经断开,而LWIP没有自动检测到这种断开并进行相应的处理。具体卡在这个地方: ret xQueueReceive(mbox->mbx, &(*msg), portMAX_DELAY); //具…...
Linux环境安装Docker Engine
Docker是一个开源的应用容器引擎,由Go语言开发,基于Linux内核技术。Docker通过将应用及其依赖打包到可移植的容器中,实现了应用的快速部署和高效管理。Docker容器具有轻量级、快速启动、可移植性强等特点,能够显著提升资源利用率和…...
大厂面试题分享
大厂面试题分享 Redis持久化方式AOF优缺点RDB优缺点 如何保证Redis和Myql的一致性索引下推输入url到浏览器发生了什么ReentranLock底层原理SpringBoot 的启动流程 Redis持久化方式 Redis提供了两种主要的持久化机制,分别是AOF(Append-Only File…...
FPGA面试问题整理
1. 逻辑设计中竞争与冒险概念,如何识别和消除? 竞争:在组合逻辑电路中,信号经过多条路径到达输出端,每条路径经过的逻辑门不同存在时差,在信号变化的瞬间存在先后顺序。这种现象叫竞争。 冒险:由…...
3Done学习笔记
一、基本操作 1、旋转视角 使用左下角立方体选择; 右键可以拖动视角; 中间滑轮按住拖动整个舞台界面。 2、平移和旋转 右键选择移动,有两种方式。 第一种选择起始点,按照起始点位置移动到终止点(边、角、中心点…...
AI学习指南深度学习篇-卷积层详解
AI学习指南深度学习篇-卷积层详解 一、引言 随着人工智能技术的不断发展,深度学习作为人工智能领域的热门分支之一,正在逐渐成为各个领域的核心技术。而在深度学习中,卷积神经网络(Convolutional Neural Network,CNN…...
2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂
第一弹赛题的选择与前期方案的准备 opencv调用摄像头bug的解决 机械臂的组装 采用三个舵机,组成一个三自由度的机械臂。 并且利用电磁吸盘的方式,完成对棋子的抓取工作,后面的事实证明,在预算不足的情况下,队友手搓…...
如何在Java、C、Ruby语言中使用Newscatcher API
Newscatcher 世界实时新闻聚合API 一款强大的数据服务工具,它通过先进的网络爬虫技术,实时从全球超过70,000个新闻源聚合新闻内容。这个API能够提供全面、多角度的新闻报道,包括但不限于标题、作者、发布日期、全文内容以及媒体资源链接。它使…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
