Qt用c++/python 分别实现动态漏斗显示

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPainter>
#include<QTimer>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    int  start_timer(int interval);
private:
    int maxval =100;
    int minval =0;
    int curval =0;
    QTimer *timer;
    int  timer_interval;



protected:
    void paintEvent(QPaintEvent *event) override;
};
#endif // WIDGET_H
#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    timer= new QTimer(this);
    connect(timer,&QTimer::timeout,this,[=](){
        curval+=5;
        if(curval>maxval){
            curval= 0;
        }
        update();
    });


}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent *event){

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing,true);

    QPainterPath path ;
    path.moveTo(10,10);
    path.lineTo(width()-10,10);
    path.lineTo(width()-10,height()-height()/3);
    path.lineTo(width()-width()/3-10,height()-10);
    path.lineTo(width()-2*width()/3-10,height()-10);
    path.lineTo(10, height() - height() / 3);
    path.closeSubpath();
    painter.setBrush(Qt::NoBrush);//
    painter.setClipPath(path);



    painter.save();
    painter.translate(0,height()-10);
    painter.setPen(Qt::NoPen);
    painter.setBrush(curval<0.8*maxval?Qt::yellow:Qt::red);
    painter.drawRect(0,0,width(),-height()/(maxval-minval)*curval);

    painter.restore();


    painter.setPen(QPen(Qt::blue,3));
    painter.drawPath(path);

    painter.setFont(QFont("楷体",30));
    painter.drawText(width()/2-90,height()/3,"目标值:"+QString::number(maxval));
    painter.drawText(width()/2-90,height()/2,"当前值:"+QString::number(curval));





}

int Widget::start_timer(int interval){
    timer->start(interval);
}

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtGui import *



class Window(QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self._maxval=100
        self._minval = 0
        self._curval = 0

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.On_timer)
        self.timer.start(100)

    def On_timer(self):
        self._curval+=5
        if self._curval>self._maxval:
            self._curval =0
        self.update()
        print(self._curval)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing,True)

        path = QPainterPath()

        path.moveTo(10,10)
        path.lineTo(self.width()-10,10)
        path.lineTo(self.width()-10,self.height()-self.height()/3)
        path.lineTo(self.width()-self.width()/3-10,self.height()-10)
        path.lineTo(self.width()-2*self.width()/3-10,self.height()-10)
        path.lineTo(10, self.height() - self.height() / 3)
        path.closeSubpath()
        painter.setBrush(Qt.BrushStyle.NoBrush)
        painter.setPen(QPen(Qt.red,3))

        painter.setClipPath(path) #设置可

        painter.setBrush(Qt.yellow if self._curval<0.8*self._maxval else Qt.red)
        painter.save()
        painter.translate(0,self.height()-10)
        painter.setPen(Qt.PenStyle.NoPen)
        painter.drawRect(0,0,self.width(),-self.height()/(self._maxval-self._minval)*self._curval)
        painter.restore()

        painter.setPen(QPen(Qt.blue,3))
        painter.setBrush(Qt.BrushStyle.NoBrush)
        painter.drawPath(path)

        painter.setFont(QFont("楷体",30))
        painter.drawText(self.width()/2-80,self.height()/3,f"目标值{self._maxval}")
        painter.drawText(self.rect(),Qt.AlignmentFlag.AlignCenter,f"当前值{self._curval}")


















if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec())








  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值