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_OBJECT

public:
    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 = True
        self._offBgBrush:QBrush = Qt.black
        self._onBgBrush: QBrush = Qt.blue
        self._offIndiicatorBrush: QBrush = Qt.red
        self._onIndiicatorBrush: QBrush = Qt.green
        self._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 else
                         self._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._isOff
            self._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())








运行效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea连接远程仓库

git ->克隆。 url为远程仓库的地址&#xff0c;输入好后&#xff0c;选择项目存放目录&#xff0c;再点击克隆 点击新窗口打开。 切换到对应分支

使用 Gin-Docs 自动生成 API 文档

该插件移植自 Python 的 Flask-Docs&#xff0c;可以根据代码注释生成文档页面&#xff0c;支持离线文档下载和生成&#xff0c;支持在线调试&#xff0c;支持密码认证。 Gin-Docs Gin API 文档自动生成插件 特性 根据代码注释自动生成 Markdown 文档支持离线 Markdown 文档下…

VBA 引用从SQL数据库取数据的几个方法

首先&#xff0c;要定义连接的数据集 Set objRec CreateObject("ADODB.Recordset")Set objConn CreateObject("ADODB.Connection")然后在代码中要定义SQL语句&#xff0c;以便获取数据 sqlstr sqlstr " select t1.FBillNo ,t_Item.fname type,t1…

【稀疏三维重建】pixelSplat:仅需两张图像的3D Gaussian Splats重建

文章目录 一.摘要二、相关工作 , 背景(gs)三、基于图像的三维高斯预测3.1 双视图图像编码器&#xff08;解决尺度模糊性&#xff09;3.2 &#xff08;像素对齐的&#xff09;高斯参数预测 四、实验效果 论文&#xff1a;《pixelSplat: 3D Gaussian Splats from Image Pairs for…

新串口通道打通纪实

在计算机系统中&#xff0c;串口是“古老”的通信方式&#xff0c;和它同时代的“并口”通信方式已经消失了。但它仍然顽强的存活着&#xff0c;主要原因是在开发和调试底层软件时还经常用到串口。 正因为有这样的需求&#xff0c;幽兰代码本是支持串口的&#xff0c;而且有两种…

玩转Matlab-Simscape(初级)- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分2)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;理论部分2&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

Python项目——基于回合制的RPG游戏设计与实现

基于回合制的RPG游戏设计与实现 项目概述 《魔法冒险》是一款基于回合制战斗的角色扮演游戏。玩家将创建一个角色&#xff0c;探索世界&#xff0c;战斗敌人&#xff0c;收集物品并提升等级。 项目设计报告 一、引言 本项目的目标是实现一个基于回合制战斗的 RPG 游戏&…

6---Linux下版本控制器Git的知识点

一、Linux之父与Git的故事&#xff1a; Linux之父叫做“Linus Torvalds”&#xff0c;我们简称为雷纳斯。Linux是开源项目&#xff0c;所以在Linux的早期开发中&#xff0c;许多世界各地的能力各异的程序员都参与到Linux的项目开发中。那时&#xff0c;雷纳斯每天都会收到许许…

1-4 GPIO输入模式(ARM-GD32)

输入结构 浮空输入模式&#xff1a; 上拉输入&#xff1a; 上面的电路浮空输入的状态是不确定的故需要通过设置上拉电阻的方式将电平设置为高电平&#xff0c;也就是确定的状态&#xff0c;此时下拉电阻处于关闭的状态&#xff0c;当按键没有按下的时候&#xff0c;处于浮空的状…

the7主题下载,探索WordPress主题的无限可能

在数字时代&#xff0c;一个出色的网站是任何企业或个人品牌的必备。但在这个竞争激烈的网络世界中&#xff0c;如何让您的网站脱颖而出&#xff1f;答案就是 the7 —— 一款专为创造独特和视觉冲击力强的网站而设计的 WordPress 主题。 1. 无限设计可能性 the7 以其独特的设…

Mini Cheetah 代码分析(八)基于零空间的任务分级

一、主要公式 二、源代码注释 三、相关原理解释 一、主要公式 二、源代码注释 该功能的实现在文件KinWBC.cpp中的FindConfiguration函数&#xff0c;主要看注释&#xff0c;与公式是能够对应起来的&#xff0c;由第0个任务&#xff0c;也就是接触任务开始进行迭代&#xff0…

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

Scrapy爬虫:利用代理服务器爬取热门网站数据

在当今数字化时代&#xff0c;互联网上充斥着大量宝贵的数据资源&#xff0c;而爬虫技术作为一种高效获取网络数据的方式&#xff0c;受到了广泛的关注和应用。本文将介绍如何使用Scrapy爬虫框架&#xff0c;结合代理服务器&#xff0c;实现对热门网站数据的高效爬取&#xff0…

金价又双叒涨了!现货黄金什么比较好

虽然近期有新闻显示&#xff0c;国内的实物黄金价格出现大幅的下跌&#xff0c;但是从整体看&#xff0c;多个黄金投资品种的长期上升趋势还是比较稳定的&#xff0c;因此我们会看到&#xff0c;很多投资者会趁现在这波下跌重新入场做多。那么投资黄金买什么比较好呢&#xff1…

2024年5月18日(星期六)骑行香杆箐

2024年5月18日 (星期六&#xff09;骑行香杆箐&#xff0c;早8:30到9:00&#xff0c;郊野公园西门集合&#xff0c;9:30准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:郊野公园西门集合 &#xff0c;家住东&#xff0c;西&#xff0c;南…

dvwa靶场 JavaScript Attacks(js攻击)全难度教程(附代码分析)

JS简介 一种解释型语言&#xff08;代码不需要编译&#xff09;&#xff0c;一般镶嵌在html或者php中实现。 JavaScript Attacks&#xff08;Security Level: low&#xff09; 代码分析 <?php $page[ body ] . <<<EOF <script>/* MD5 code from here h…

参赛指南第二弹!9省齐发 详解赛事参与全攻略

一. 大赛介绍 中国机器人及人工智能大赛是由中国人工智能学会、教育部高等学校计算机课程教学指导委员会联合主办。旨在引导和激励广大青年学生弘扬创新精神&#xff0c;搭建良好的科技创新赛事平台&#xff0c;积极推动广大学生参与机器人、人工智能科技创新实践、提高团队协…

动规解决01背包/完全背包精讲

还不会用动态规划解决01背包/完全背包&#xff1f;看这一篇文章就够了&#xff01; 首先我们要明白什么是01背包和完全背包。 背包问题总体问法就是&#xff1a; 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为vi​ ,价值为wi​…

Linux|如何允许 awk 使用 Shell 变量

引言 当我们编写 shell 脚本时&#xff0c;我们通常会在脚本中包含其他较小的程序或命令&#xff0c;例如 awk 操作。就 Awk 而言&#xff0c;我们必须找到将一些值从 shell 传递到 Awk 操作的方法。 这可以通过在 Awk 命令中使用 shell 变量来完成&#xff0c;在本文中&#x…