qt 自定义样式 switch开关,已解决

news2024/11/13 9:36:07

 

        在日常需求中,需要对功能增加一个开关,因此做了简单封装。结果能正常使用。自定义信号接收!

实现

	QWidget* switchBtn = new CCendSwitchWidget(btn_value);
	connect(switchBtn, SIGNAL(clicked(bool,QString)), this, SLOT(clickedSlot(bool, QString)));

 头文件


#ifndef C_CEND_SWITCH_WIDGET_H
#define C_CEND_SWITCH_WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QEvent>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QVariantAnimation>
#include <QMap>
#include <QGuiApplication>
#include <string>
using std::string;

class CCendSwitchWidget : public QWidget
{
    Q_OBJECT

public:
    CCendSwitchWidget(QString,QWidget* parent = 0);
    QSize sizeHint() const override;
    bool isOpened() const;

signals:
    void clicked(bool,QString);

private:
    void setButtonPos(float where);
    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);

private:
    bool opened;
    bool hover;
    float atWhere; /* [0, 1] */
    QPoint pressPt;

    QString m_pDataType;
};

#endif //C_CEND_SWITCH_WIDGET_H

cpp

#include "CCendSwitchWidget.h"

CCendSwitchWidget::CCendSwitchWidget(QString type,QWidget* parent) :
    QWidget(parent)
{
    m_pDataType = type;
    opened = false;
    hover = false;
    atWhere = 0;
}

void CCendSwitchWidget::setButtonPos(float where)
{
    atWhere = where;
    update();
}

bool CCendSwitchWidget::isOpened() const
{
    return opened;
}

void CCendSwitchWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    qreal rad = height() * 0.5; /* 圆半径 */
    int xleft = rad;
    int xright = width() - rad;
    int xpos = xleft + (xright - xleft) * atWhere;
    painter.setPen(Qt::NoPen);
    painter.setBrush((xpos == xright) ? QColor(0, 170, 255) : QColor(173, 173, 173));
    painter.drawRoundedRect(0, 0, width(), height(), rad, rad);
    if (hover) /* 鼠标悬停稍微提亮一点 */
    {
        painter.setBrush(QColor(255, 255, 255, 63));
        painter.drawRoundedRect(0, 0, width(), height(), rad, rad);
    }
    painter.setPen(QColor(213, 213, 213));
    painter.setBrush(QColor(243, 243, 243));
    painter.drawEllipse(QPointF(xpos, rad), rad - 1, rad - 1);
}

void CCendSwitchWidget::mousePressEvent(QMouseEvent *event)
{
    pressPt = event->pos();
}

void CCendSwitchWidget::mouseReleaseEvent(QMouseEvent *event)
{
    if (pressPt == event->pos())
    {
        opened = !opened;
        emit clicked(opened, m_pDataType);
        QVariantAnimation* ani = new QVariantAnimation(this);
        ani->setStartValue(0.0f);
        ani->setEndValue(1.0f);
        ani->setDuration(200);
        ani->setDirection(opened ? QVariantAnimation::Forward : QVariantAnimation::Backward);
        connect(ani, &QVariantAnimation::valueChanged, this,
            [this](const QVariant& value) { setButtonPos(value.toFloat()); });
        ani->start(QAbstractAnimation::DeleteWhenStopped);
    }
}

void CCendSwitchWidget::enterEvent(QEvent *event)
{
    hover = true;
    update();
}

void CCendSwitchWidget::leaveEvent(QEvent *event)
{
    hover = false;
    update();
}

QSize CCendSwitchWidget::sizeHint() const
{
    return QSize(21, 10);
}

 最准效果

参考

https://www.cnblogs.com/mengxiangdu/p/16926176.html

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

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

相关文章

【吊打面试官系列-ZooKeeper面试题】Zookeeper 的典型应用场景

​大家好&#xff0c;我是锋哥。今天分享关于 【Zookeeper 的典型应用场景 】面试题&#xff0c;希望对大家有帮助&#xff1b; Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;开发人员可以使用它来进行分布式数据的发布…

Zabbix监控应用

目录 一.监控tomcat 二.Zabbix监控TCP 三.zabbix监控nginx 四.snmp监控 五.监控web 六.聚合图形 一.监控tomcat 1.在tomcat服务器上安装zabbix-agent服务 [rootnode2 etc]#vim zabbix_agentd.conf 94 Server192.168.240.13 #指向当前zabbix server ##### Passive chec…

Web 性能入门指南-3.5 优化单页应用程序 (SPA)

&#x1f338; 欢迎来到前端后花园&#xff01;这里是一个温馨的小角落&#xff0c;专为热爱前端技术的你打造。没有华丽的辞藻&#xff0c;只有真诚的分享。希望你能在这里找到实用的内容&#xff0c;学到新知识&#xff0c;同时也欢迎你畅所欲言&#xff0c;分享你的思考和见…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好&#xff0c;办公人…

jenkins替换配置文件

1.点击首页的【Manage Jenkins】-【Manage Plugins】&#xff0c;在选项【Available plugins】安装 Config File Provider Plugin &#xff0c;安装后重启jenkins 2.安装完成后会有这个图标&#xff0c;点进去 3.点击新建&#xff0c;选择自定义&#xff0c;填入要替换的文件…

C语言 | Leetcode C语言题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; /* 求和运算 */ /* 对[0,n]求和, 减去数组每个元素, 得出丢失的元素 */ int missingNumber(int* nums, int numsSize){int i;int sum numsSize;for (i 0; i < numsSize; i) {sum i - nums[i];}return…

【Spring】SpringRetry重试机制和Spring异步任务发送操作结合应用场景实操,通俗易懂

平时调用一些第三方接口或者内部接口&#xff0c;可能出现处理异常或者超时或者意外因素&#xff0c;我们可以使用重试机制来为用户提高体验。 1.引用依赖 <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</a…

【单片机毕业设计选题24079】-基于单片机的室内通风系统

系统功能: 系统分为手动和自动模式&#xff0c;上电默认为自动模式&#xff0c;自动模式下系统根据采集到的传感器值 自动控制&#xff0c;温度过低后自动开启加热&#xff0c;湿度过低后自动开启继电器加湿&#xff0c;获取到烟雾值大于设定值或获取到的CO值大于设定的CO值时…

视图,存储过程和触发器

目录 视图 创建视图&#xff1a; 视图的使用 查看库中所有的视图 删除视图 视图的作用&#xff1a; 存储过程&#xff1a; 为什么使用存储过程&#xff1f; 什么是存储过程&#xff1f; 存储过程的创建 创建一个最简单的存储过程 使用存储过程 删除存储过程 带参的存储…

【已解决 Python】 TypeError: can only concatenate list (not “int”) to list

【已解决 Python】 TypeError: can only concatenate list (not “int”) to list 在Python编程中&#xff0c;TypeError: can only concatenate list (not "int") to list是一个常见的错误。此错误表明你尝试将一个整数&#xff08;int&#xff09;与列表&#xff…

初识redis:通用命令

今天我们简单介绍一些关于redis的基础命令。 目录 get 和 set 全局命令 keys EXISTS del&#xff08;delete&#xff09; expire TTL Redis的key过期策略是怎么实现的&#xff1f; type get 和 set 连接到云服务器后&#xff0c;通过redis-cli命令进入到redis客户端…

7月21日读Neuroimage Denoiser

Neuroimage Denoiser for removing noise from transient 1 fluorescent signals in functional imaging. Summary Neuroimage Denoiser&#xff0c;这是一种新型的基于U-Net的模型&#xff0c;可以有效去除显微镜记录中瞬时局部荧光信号的噪声。该模型使去噪过程与记录频率和…

sql注入 mysql 执行命令 sql注入以及解决的办法

我们以前很可能听过一个词语叫做SQL注入攻击&#xff0c;其是威胁我们系统安全的最危险的因素之一&#xff0c;那么到底什么是SQL注入攻击呢&#xff1f;这里我会用一个最经典最简单的例子来跟大家解释一下&#xff1a; 众所周知&#xff0c;我们的sql语句都是有逻辑的&#xf…

Python爬虫:代理ip电商数据实战

引言&#xff1a;数据访问管理引发的烦恼 作为一名Python博主&#xff0c;爬虫技能对于获取和分析数据至关重要&#xff0c;经常爬一下&#xff0c;有益身心健康嘛。爬虫技术对很多人来说&#xff0c;不仅仅是一种工具&#xff0c;更像是一种艺术&#xff0c;帮助我们从互联网…

大模型入门学习笔记(非常详细)零基础入门到精通,收藏这一篇就够了

一、认识大模型 1.1 从人工智能到大模型的演变 学完本文后&#xff0c;你将能够&#xff1a; 掌握大模型的特点、重要概念以及工作方式 了解大模型的基本概况和产品矩阵 了解大模型&#xff0c;尤其是大语言模型的应用场景和示例 大模型是人工智能领域的一个重要里程碑&a…

C++相关概念和易错语法(23)(set、仿函数的应用、pair、multiset)

1.set和map存在的意义 &#xff08;1&#xff09;set和map的底层都是二叉搜索树&#xff0c;可以达到快速排序&#xff08;当我们按照迭代器的顺序来遍历set和map&#xff0c;其实是按照中序来遍历的&#xff0c;是排过序的&#xff09;、去重、搜索的目的。 &#xff08;2&a…

展馆导览系统架构解析,从需求分析到上线运维

在物质生活日益丰富的当下&#xff0c;人们对精神世界的追求愈发强烈&#xff0c;博物馆、展馆、纪念馆等场所成为人们丰富知识、滋养心灵的热门选择。与此同时&#xff0c;人们对展馆的导航体验也提出了更高要求&#xff0c;展馆导览系统作为一种基于室内外地图相结合的位置引…

STM32智能农业监测与控制系统教程

目录 引言环境准备智能农业监测与控制系统基础代码实现&#xff1a;实现智能农业监测与控制系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监测与优化问题解决方案与优化收尾与总结 1. 引言 智能农…

电脑基础知识 | 电脑的基本组成

电脑作为我们日常工作和娱乐的重要工具&#xff0c;扮演着举足轻重的角色。当我们谈论电脑的基本组成时&#xff0c;其实是在探讨电脑硬件和软件两个核心部分。硬件是电脑看得见、摸得着的物理设备&#xff0c;而软件则是运行在这些硬件之上的程序和指令。两者相辅相成&#xf…

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…