Qt自定义QpushButton分别在c++/python中实现

//.h文件#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QPainter>
#include<QMouseEvent>
#include<QPropertyAnimation>
#include<QResizeEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();
protected:void paintEvent(QPaintEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void resizeEvent(QResizeEvent *event)override;private:Ui::Widget *ui;bool isOff = true;QBrush offBgBrush = Qt::black;QBrush onBgBrush = Qt::blue;QBrush offIndIndiicatorBrush = Qt::red;QBrush onIndIndiicatorBrush = Qt::green;QString offtext = "OFF";QString ontext = "ON";QPropertyAnimation *ani;int current_x;};
#endif // WIDGET_H

.cpp 源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ani = new QPropertyAnimation(this);ani->setTargetObject(this);ani->setDuration(300);ani->setEasingCurve(QEasingCurve::InOutBack);current_x=height()/2;connect(ani,&QPropertyAnimation::valueChanged,this,[=](const QVariant& value){current_x=value.toInt();update();});}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *event){Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing,true);painter.setPen(Qt::NoPen);painter.setBrush(isOff?offBgBrush:onBgBrush);painter.drawRoundedRect(this->rect(),height()/2,height()/2);painter.setBrush(isOff?offIndIndiicatorBrush:onIndIndiicatorBrush);
//    QPoint center;
//    isOff ? center=QPoint(height()/2,height()/2):center=QPoint(width()-height()/2,height()/2);
//    painter.drawEllipse(center,height()/2-10,height()/2-10);painter.drawEllipse(QPoint(current_x,height()/2),height()/2-10,height()/2-10);painter.setPen(Qt::white);painter.setFont(QFont("楷体",30));painter.drawText(this->rect(),Qt::AlignCenter,isOff?offtext:ontext);}void Widget::mousePressEvent(QMouseEvent *event){if(event->button()==Qt::LeftButton){isOff?ani->setDirection(QVariantAnimation::Forward):ani->setDirection(QVariantAnimation::Backward);isOff = !isOff;ani->start();}
}void Widget::resizeEvent(QResizeEvent *event){ani->setStartValue(height()/2);ani->setEndValue(width()-height()/2);}

pyhong实现代码:

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *class Switch(QWidget):def __init__(self,*args,**kwargs):super().__init__(*args,**kwargs)self._isOff = Trueself._offBgBrush:QBrush = Qt.blackself._onBgBrush: QBrush = Qt.blueself._offIndiicatorBrush: QBrush = Qt.redself._onIndiicatorBrush: QBrush = Qt.greenself._offText :str ="OFF"self._onText: str = "On"self.current_x:int = self.height()/2#动画self._ani = QPropertyAnimation(self)self._ani.setTargetObject(self)self._ani.setDuration(300)self._ani.setEasingCurve(QEasingCurve.Type.InOutBack)self._ani.valueChanged.connect(self._ani_value_changed)def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.RenderHint.Antialiasing,True)painter.setPen(Qt.PenStyle.NoPen)painter.setBrush(self._offBgBrush if self._isOff else self._onBgBrush)painter.drawRoundedRect(self.rect(),self.height()/2,self.height()/2)painter.setBrush(self._offIndiicatorBrush if self._isOff else self._onIndiicatorBrush)length:int = int(self.height()/2)painter.drawEllipse(QPoint(self.current_x,self.height()/2),length-10,length-10)painter.setPen(Qt.white)painter.setFont(QFont("楷体",30))painter.drawText(self.rect(),Qt.AlignmentFlag.AlignCenter,self._offText if self._isOff elseself._onText)return super().paintEvent(event)def mousePressEvent(self, event):if event.button()==Qt.MouseButton.LeftButton:if self._isOff:self._ani.setDirection(QVariantAnimation.Direction.Forward)else:self._ani.setDirection(QVariantAnimation.Direction.Backward)self._isOff = not self._isOffself._ani.start()return super().mousePressEvent(event)def resizeEvent(self, event):self._ani.setStartValue(self.height()/2)self._ani.setEndValue(self.width()-self.height()/2)return super().resizeEvent(event)def _ani_value_changed(self,value):self.current_x = int(value)self.update()if __name__ == '__main__':app = QApplication(sys.argv)win = Switch()win.show()sys.exit(app.exec())

运行效果:

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

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

相关文章

Google Chrome GPU渲染抓包

非安全模式启动 "C:\Program Files\Google\Chrome\Application\chrome.exe" --ignore-certificate-errors --allow-running-insecure-content --disable-web-security 配置环境 set RENDERDOC_HOOK_EGL0 "C:/Program Files/Google/Chrome/Application/chrom…

Python送你小花花

快到520了&#xff0c;准备好送上你的爱意了吗&#xff1f; 还记得去年从网上模仿了一篇python使用turtle画的小花花程序&#xff0c;当时还没有转行到程序员行业&#xff0c;刚刚入门学习编程&#xff0c;还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

国际铝业协会、中铝、百威亚太、海德鲁、诺贝利斯等企业将出席2024第二届中国绿色铝业国际峰会

据中国有色金属工业协会统计数据显示&#xff0c;2022年我国有色行业二氧化碳排放量约为6.6亿吨&#xff0c;其中铝行业二氧化碳排放量为5.5亿吨&#xff0c;占有色金属行业总排放量的83.3%&#xff0c;约占全国总排放量比重的5%&#xff08;2022年中国二氧化碳排放量约为110亿…

企业研发必备网络:这些关键特性,你get了吗?

对于以研发为核心的企业&#xff0c;如软件开发、生物制药、智能汽车等&#xff0c;安全、稳定的研发网络可是他们业务发展不可或缺的。那么&#xff0c;这些研发网络究竟有哪些独特之处&#xff0c;又能为企业带来哪些价值呢&#xff1f; 首先&#xff0c;我们知道企业研发常常…

【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

目录 一&#xff1a;选择排序——原理 二&#xff1a;选择排序——分析 三&#xff1a;选择排序——实现 四&#xff1a;选择排序——优化 五&#xff1a;选择排序——效率 一&#xff1a;选择排序——原理 选择排序的原理&#xff1a;通过遍历数组&#xff0c;选出该数组…

【二叉树】(二)二叉树的基础修改构造及属性求解1

&#xff08;二&#xff09;二叉树的基础修改构造及属性求解1 翻转二叉树递归实现迭代实现&#xff08;深度遍历&#xff09;层序实现&#xff08;广度遍历&#xff09; 对称二叉树递归实现迭代实现&#xff08;非层序遍历&#xff09; 二叉树的最大深度递归法迭代法&#xff0…

海外静态IP:全球互联的稳定之选

在全球化的商业环境中&#xff0c;企业与个人对于网络的依赖日益加深&#xff0c;而一个稳定、可靠的海外静态IP成为了连接世界的关键。本文将从五个方面深入探讨海外静态IP的重要性、应用场景、技术优势、市场趋势以及选择时的考量因素。 一、海外静态IP的重要性 静态IP地址是…

python创建新环境并安装pytorch

python创建新环境并安装pytorch 一、创建新环境1、准备工作2、创建虚拟环境并命名3、激活虚拟环境 二、安装pytorch1、pytorch官网2、选择与你的系统相对应的版本3、安装成功 一、创建新环境 1、准备工作 本次创建的环境是在anaconda环境下&#xff0c;否则需要在纯净环境下创…

【SQL】SQL常见面试题总结(2)

目录 1、增删改操作1.1、插入记录&#xff08;一&#xff09;1.2、插入记录&#xff08;二&#xff09;1.3、插入记录&#xff08;三&#xff09;1.4、更新记录&#xff08;一&#xff09;1.5、更新记录&#xff08;二&#xff09;1.6、删除记录&#xff08;一&#xff09;1.7、…

Python学习之路 | Python基础语法(一)

数据类型 Python3 中常见的数据类型有&#xff1a; Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dict…

macbook同时配置github,gitlab,gitee

背景&#xff1a;我的本地环境之前已经配置了github与gitlab的共存&#xff0c;现在想要添加一个gitee的项目&#xff0c;我的全局的账号和邮箱配置已经配置为了gitlab的账号邮箱&#xff0c;下边新增gitee的配置时没有对这一块儿的变更。新增了gitee后&#xff0c;我也对gitla…

Java面试八股之为什么要使用克隆

Java中为什么要使用克隆&#xff1f;怎么实现对象的克隆&#xff1f;深拷贝和浅拷贝的区别是什么 在Java中使用克隆主要有以下几个原因&#xff1a; 创建对象副本&#xff1a;克隆可以快速创建一个与原对象状态完全相同的副本&#xff0c;无需手动逐一复制每个属性。这种情况…

渗压计与水位计的区别:监测工具的关键用途解析

在土木工程和水利工程领域&#xff0c;渗压计和水位计是两种重要的监测工具。它们虽然在外观和一些基本功能上可能相似&#xff0c;但其实各有专长&#xff0c;适用于不同的监测需求。了解它们的区别对于正确选择和应用这些工具至关重要本文将探讨渗压计和水位计的主要区别&…

vue加密传输,后端获取进行解密。

文章目录 概要Vue前端加密后端进行解密小结 概要 vue界面加密传输&#xff0c;后端获取进行解密&#xff0c;适用于登录时密码加密传输。 Vue前端加密 1.安装jsencrypt包&#xff1a; npm install jsencrypt安装完成后package.json会有jsencrypt依赖 2.引入jsencrypt.js到文…

CSRF 攻击实验:更改请求方式绕过验证

前言 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;也称为XSRF&#xff0c;是一种安全漏洞&#xff0c;攻击者通过欺骗用户在受信任网站上执行非自愿的操作&#xff0c;以实现未经授权的请求。 CSRF攻击利用了网站对用户提交的请求缺乏充分验证和防范…

aigc在前端中的应用-CodeGeex

前言&#xff1a;目前市场上优秀的智能编程助手有很多&#xff0c;其中以GitHub Copilot&#xff0c;Tabnine为最&#xff0c;但是目前这两款优质的智能编程助手都是需要付费的。如果不选择花费的话&#xff0c;在这里我们向小伙伴推荐免费的智能编程助手codegeex&#xff0c;性…

F5 Big-IP的一些查看命令

1 查看主机名&#xff0c;序列号&#xff0c;版本号 system —>configuration—>Device

抖音评论采集python爬虫(含一二级评论内容)

声明 仅用于学习交流&#xff0c;不用于其他用途 正文 随着抖音评论采集更新需要登录&#xff0c;由于不懈的努力&#xff0c;攻破这一难点&#xff0c;不需要登录采集作品所有评论信息 话不多说上代码看效果&#xff1a; 输入作品id: 这样就拿到评论信息了&#xff0c;可以…

使用virtualbox和vagrant搭建centos环境报错问题解决

启动提示下面的异常&#xff1a; Timed out while waiting for the machine to boot. This means that Vagrant was unable to communicate with the guest machine within the configured ("config.vm.boot_timeout" value) time period.If you look above, you sh…

DiskGenius帮你恢复系统无法识别的U盘数据

场景还原 前两天早上U盘复制文件卡死后&#xff0c;强行断开U盘&#xff0c;再次使用直接无法访问&#xff0c;心拔凉拔凉&#xff01;&#xff01; 使用驱动器G:中的光盘之前需要将其格式化 位置不可用-无法访问U盘 常规科普 一、U盘无法识别 1、检查U盘是否插入正确&…