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.hqwc.cn/news/705584.html

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

相关文章

React Native 开发心得分享

有一段时间没更新了&#xff0c;花了点时间研究了下 React Native&#xff08;后续用 RN 简称&#xff09;&#xff0c;同时也用该技术作为我的毕设项目(一个校园社交应用&#xff0c;仿小红书)&#xff0c;经过了这段时间的疯狂折腾&#xff0c;对 RN 生态有了一定的了解&…

C语言/数据结构——栈的实现

一.前言 今天我们讲解新的领域——栈。 二.正文 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其允许在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#…

【漏洞复现】Secnet-智能路由系统 actpt_5g.data信息泄露

0x01 产品简介 Secnet安网智能AC管理系统是广州安网通信技术有限公司(简称“安网通信”)的无线AP管理系统 0x02 漏洞描述 Secnet智能路由系统 acipt 5g.data 接口存在信息泄露漏洞&#xff0c;未经身份验证的远程攻击者可以利用此漏洞获取系统账户名密码等重要凭据&#xff…

OFDM 802.11a的FPGA实现(十六)长训练序列:LTS(含Matlab和verilog代码)

目录 1.前言2.原理3.Matlab生成长训练序列4.硬件实现5.ModelSim仿真6.和Matlab仿真结果对比 原文链接&#xff08;相关文章合集&#xff09;&#xff1a; OFDM 802.11a的xilinx FPGA实现 1.前言 在之前已经完成了data域数据的处理&#xff0c;在构建整个802.11a OFDM数据帧的时…

如何启用WooCommerce商城快捷结帐:3 种简单方法

使用WooCommerce商城快捷结帐可帮助您提高商店的转化率。 70%的顾客同意在线商店的快速结账流程会鼓励他们完成购买。 在结账过程中您让购物者完成的步骤越多&#xff0c;他们完成该流程的可能性就越小。 解决方案是什么&#xff1f; 通过跳过默认的WooCommerce商城购物车页…

从RTTR谈Reflection机制

虽然C11引入了RTTI、Metaprogramming 等技术&#xff0c;但C在Reflection编程方面依旧功能有限。在社区上&#xff0c;RTTR则提供了一套C编写的反射库&#xff0c;补充了C在Reflection方面的缺陷。 零、环境 操作系统Windows 11Visual StudioVisual Studio Community 2022 CMa…

Excel提取某一列的唯一值

点击【筛选】&#xff08;【高级筛选】&#xff09;&#xff0c;参数里&#xff1a; 列表区域&#xff1a;为需要选择唯一值的那一列复制到&#xff1a;生成唯一值的目标区域 据说新版本的excel有了unique()函数&#xff0c;可以很快捷的选择某一列的唯一值&#xff0c;但是博…

知识图谱必须要图数据库嘛?

在 ZH上又看到一个问题&#xff0c;觉得挺有意思&#xff0c;小聊一二。 “知识图谱必须要图数据库吗&#xff1f;” ——使用非关系型数据库&#xff0c;关系型数据库&#xff0c;在计算图的一些特征上&#xff0c;通过优化算法是否能达到使用图数据库接近的计算速度呢&#x…

ROS2系统与px4通信测试

参考文章&#xff1a; No communication with ROS2 using MicroXRCEAgent with px4 board ROS2官方安装及测试程序 概要 新安装的ROS2与PixHawk开发板进行通信。 操作步骤 启动示例程序&#xff0c;在&#xff5e;/ws_sensor_combined/src路径下执行&#xff1a; ros2 l…

算法交易的分类到底有哪些?哪些才适合我们使用?

现在为了扩大自己的收益率&#xff0c;越来越多的人都在使用算法交易&#xff01; 算法交易的分类具体哪个更适合自己使用&#xff0c;我们了解下它的本质和对比&#xff0c;自己就清楚该怎么用了。 &#xff08;小编自己用的最后一种&#xff0c;不清楚自己怎么选择大家交流讨…

Java——CLASSPATH配置

什么是CLASSPATH&#xff1f; 答&#xff1a; classpath类似于windows中的系统环境变量path。 在windows中&#xff0c;如果要想在DOS命令窗口中执行一个程序。系统会先去当前文件路径下找对应命令的执行程序。如果找不到&#xff0c;就会到系统环境变量path中挨个遍历每一个路…