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.mzph.cn/news/838167.shtml

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

相关文章

ue引擎游戏开发笔记(38)——实现敌人接收攻击伤害,并作出反应

1.需求分析&#xff1a; 现在已经显示造成实际伤害&#xff0c;但敌人对实际伤害并未产生反馈&#xff0c;例如还击&#xff0c;或者死亡倒地等等&#xff0c;实现敌人对于受击的反馈。 2.操作实现&#xff1a; 1.思路&#xff1a;在动画蓝图中添加死亡动画&#xff0c;并通过…

ESP8266-01模块继电器制作手机APP远程遥控智能开关

资料下载地址&#xff1a; ESP8266-01模块继电器制作手机APP远程遥控智能开关 这是一款使用ESP8266-01模块继电器制作手机APP远程遥控智能开关&#xff0c;它能实现远程遥控、定时、倒计时控制。电路简单&#xff0c;适合新手入门制作&#xff0c;下图是用这个智能开关制作的小…

OpenAI 推出 GPT-4o:实现多模态 AI 交互

一、前言 OpenAI 推出了其最新的 AI 模型——GPT-4o&#xff0c;此次发布的并非 GPT-4.5 或 GPT-5&#xff0c;而是一款全新的“全模态模型(Omnimodel)”。这是一个将文本、语音和视觉能力集成到单一无缝 AI 体验中的突破性发展。 GPT-4o 于 2024 年 5 月 14 日发布&#xff0…

Ubuntu 配置Samba

Ubuntu 配置&#xff1a; 安装 Samba &#xff1a; sudo apt-get install samba添加用户并设置密码&#xff08;可与ubuntu用户密码相同方便记忆&#xff09; sudo smbpasswd -a root这里我设置的密码为123456 sudo vi /etc/samba/smb.conf注意这个共享的目录一定要存在\ho…

WSL2-Ubuntu(深度学习环境搭建)

1.在Windows的WSL2上安装Ubuntu 流程可参考&#xff1a;https://www.bilibili.com/video/BV1mX4y177dJ 注意&#xff1a;中间可能需要使用命令wsl --update更新一下wsl。 2.WSL数据迁移 按照下面流程&#xff1a;开始菜单->设置->应用->安装的应用->搜索“ubun…

Folder Icons for Mac v1.9激活版:自定义文件夹图标

在追求个性和品味的今天&#xff0c;Folder Icons for Mac 让您的Mac桌面焕然一新。支持多种格式的图片和图标文件&#xff0c;满足您不同的审美需求。同时&#xff0c;软件提供丰富的图标库和模板&#xff0c;让您在定制文件夹图标时更加得心应手。Folder Icons for Mac 不仅能…

Spring AI项目Open AI对话接口开发指导

文章目录 创建Spring AI项目配置项目pom、application文件controller接口开发接口测试 创建Spring AI项目 打开IDEA创建一个新的spring boot项目&#xff0c;填写项目名称和位置&#xff0c;类型选择maven&#xff0c;组、工件、软件包名称可以自定义&#xff0c;JDK选择17即可…

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩排3的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于878的定位策略&#xff0c;方向是没问题的&#xff0c;但是8783的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果87823&…

photoshop(PS)有什么快速提升工作效率的功能?或者实用功能?这里告诉你5条!

1:文件太多&#xff0c;不方便马上找到需要插入元素&#xff08;元素放入PS会发现&#xff0c;位置不知道在哪里&#xff09;&#xff0c;点击需要选中或者搭配的元素&#xff0c;ctrlV就可以快速插入目标元素的位置了&#xff01; 点击当前元素&#xff0c;选中&#xff0c;c…

U盘中毒文件变乱码?揭秘原因与高效恢复方法!

在日常使用U盘的过程中&#xff0c;有时我们会遭遇到一个非常棘手的问题——文件突然出现乱码。当你满怀期待地插入U盘&#xff0c;准备打开某个重要文件时&#xff0c;却发现文件名或内容变成了一堆无法识别的字符&#xff0c;这种心情无异于晴天霹雳。乱码文件不仅影响了我们…

微分阻尼作用的理解

先说阻尼的作用,阻尼能够缩短系统整定时间,减小系统响应的振动幅度。 1、CODESYS位置式PID(完整ST源代码) CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.2k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看下面文章链接:CODESYS增量式…

[图解]SysML和EA建模住宅安全系统-04

1 00:00:01,200 --> 00:00:04,710 我们首先来看一下需求图的一些要点 2 00:00:05,810 --> 00:00:07,080 需求图用来干什么 3 00:00:07,210 --> 00:00:12,080 用来记录文本形式的一些需求 4 00:00:12,090 --> 00:00:13,480 和需求的素材 5 00:00:14,540 --> …

南网上行通信规约报文解析软件

本文分享一个南网上行通信规约20140617 报文解析软件 下载链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主界面如下图所示&#xff1a; 本软件同时支持南网上行通信规约20140617-Fn查询功能 软件同时支持多种规约类型&#xff0c;如&#xff1a;国网…

基于springboot实现酒店管理系统项目【项目源码+论文说明】

基于springboot实现酒店管理系统演示 摘要 时代的发展带来了巨大的生活改变&#xff0c;很多事务从传统手工管理转变为自动管理。自动管理是利用科技的发展开发的新型管理系统&#xff0c;这类管理系统可以帮助人完成基本的繁琐的反复工作。酒店是出门的必需品&#xff0c;无论…

Kotlin扩展函数和运算符重载

扩展函数 fun String.lettersCount():Int{var count 0for(i in this){if(i.isLetter())count}return count } fun main(){val str:String "12we"println(str.lettersCount()) } 相当于直接将方法写在类里面。函数体内可以直接使用this而不用传参。 运算符重载 …

vsCode 设置上下级文件夹目录分离展示?

默认情况下&#xff0c;vsCode目录文件夹会使用/合并展示在一行&#xff0c;这样视觉上看着并不直观&#xff0c;设置目录文件分离展示方法如下&#xff1a; 1、点击左下角设置图标&#xff0c;点击setting&#xff1b; 2、搜索栏输入compact&#xff1b; 3、取消勾选第一个选…

OV SSL证书年度成本概览:确保企业级安全的经济之选

随着网络安全意识的日益增强&#xff0c;SSL证书成为了网站安全的标配&#xff0c;尤其是对于企业而言&#xff0c;选择一款既能确保数据传输安全又符合预算的证书至关重要。在众多SSL证书中&#xff0c;组织验证型&#xff08;Organization Validation&#xff0c;简称OV&…

互联网轻量级框架整合之装配Bean

依赖注入和依赖查找 应该说IoC的工作方式有两种&#xff0c;一种是依赖查找&#xff0c;通过资源定位&#xff0c;把对应的资源查找出来&#xff0c;例如通过JNDI找到数据源&#xff0c;依赖查找被广泛使用在第三方的资源注入上&#xff0c;比如在Web项目中&#xff0c;数据源往…

3588 pwm android12 的操作,包含 NDK native C++

问题&#xff1a; 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程&#xff1a; 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是&#xff0c; 还不知道&#xff0c;android12 最终包含的 设备树是哪个&#xff0c;但是经过我的…

Gone框架介绍17 - 创建一个可运行在生产环境的Web项目

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档原地址&#xff1a;https://goner.fun/zh/guide/auto-gen-priest.html 请帮忙在github上点个 ⭐️吧&#xff0c;这对我很重要 &#xff1b;万分感谢&#xff01;&a…