pyqt绘制仪表盘

from PyQt5.Qt import *
class Window(QLabel):
    def __init__(self,parent=None):
        super().__init__(parent)
        self.parent=parent
        self.setMinimumSize(600,200)
        self.__title='Title:__'

        #set color
        self.pieColorStart=QColor(63,191,127) #green
        self.pieColorMid=QColor(63,127,191) #blue
        self.pieColorEnd=QColor(203,72,72) #red
        self.pointerColor=QColor(72,203,203) #lightblue

        #set word
        self.font=QFont("宋体",8)
        self.font.setBold(True)

        #set lcd init
        self.lcd_init()

        #other set
        self.startAngle=45
        self.endAngle=45
        self.maxValue=8
        self.minValue=0
        self.currentValue=6
        self.scaleMajor=8


    def set_title(self,title):
        self.__title=title
    def set_value(self,value):
        self.currentValue=value
    def lcd_init(self):
        self.lcd=QLCDNumber(self)
        self.lcd.setSmallDecimalPoint(False)
        self.lcd.setDigitCount(2)
        self.lcd.setFrameStyle(QFrame.NoFrame)
        self.lcd.setMode(QLCDNumber.Dec)
        self.lcd.setStyleSheet("color:rgb(26,95,95)")
        self.lcd.setSegmentStyle(QLCDNumber.Flat)

    def paintEvent(self, event) -> None:
        width=self.width()
        height=self.height()
        painter=QPainter(self)
        painter.translate(width/2,height/2)

        #自适应刻度
        side=min(width,height)
        painter.scale(side/200.0,side/200.0)
        painter.setRenderHints(QPainter.Antialiasing)
        painter.begin(self)

        # drawing
        self.drawColorPie(painter)
        self.drawPointer(painter)
        self.drawLine(painter)
        self.drawText(painter)
        self.drawTitle(painter)

        self.lcd.setGeometry(self.width()/2.15,self.height()/9*7,self.width()/10,self.height()/10)
        formValue="%d"%self.currentValue
        self.lcd.display(formValue)
        painter.rotate(10)
        painter.drawText(-34, 72, self.__title)

    def drawColorPie(self,painter):
        painter.save()
        radius=99
        painter.setPen(Qt.NoPen)
        rect=QRectF(-radius,-radius,radius*2,radius*2)

        angleAll=360.0-self.startAngle-self.endAngle
        #green:blue:red=1:2:1
        angleStart=angleAll*0.25
        angleMid=angleAll*0.5
        angleEnd=angleAll*0.25

        #圆中心为透明,形成圆环样式
        rg=QRadialGradient(0,0,radius,0,0)#起始圆心,半径,焦点坐标
        ratio=0.8   #透明:实色=0.8:1


        #绘制绿色圆环
        rg.setColorAt(0,Qt.transparent)#透明白
        rg.setColorAt(ratio,Qt.transparent)
        rg.setColorAt(ratio+0.001,self.pieColorStart)
        rg.setColorAt(1,self.pieColorStart)
        painter.setBrush(rg)
        painter.drawPie(rect,(270-self.startAngle-angleStart)*16,angleStart*16)

        #绘制蓝色
        rg.setColorAt(0, Qt.transparent)  # 透明白
        rg.setColorAt(ratio, Qt.transparent)
        rg.setColorAt(ratio + 0.001, self.pieColorMid)
        rg.setColorAt(1, self.pieColorMid)
        painter.setBrush(rg)
        painter.drawPie(rect, (270 - self.startAngle - angleStart-angleMid) * 16, angleMid * 16)

        #绘制红色
        rg.setColorAt(0, Qt.transparent)  # 透明白
        rg.setColorAt(ratio, Qt.transparent)
        rg.setColorAt(ratio + 0.001, self.pieColorEnd)
        rg.setColorAt(1, self.pieColorEnd)
        painter.setBrush(rg)
        painter.drawPie(rect, (270 - self.startAngle - angleStart-angleMid-angleEnd) * 16, angleEnd * 16)
        painter.restore()
    def drawPointer(self,painter):
        painter.save()
        radius=58
        painter.setPen(Qt.NoPen)
        painter.setBrush(self.pointerColor)

        #(-5,0) (0,-8) (5,0) (0,radius)
        pts=QPolygon()
        pts.setPoints(-5,0,0,-8,5,0,0,radius)
        #旋转指针,使指针指向0处
        painter.rotate(self.startAngle)
        degRotate=(360.0-self.startAngle-self.endAngle)/(self.maxValue-self.minValue)*(self.currentValue-self.minValue)
        painter.rotate(degRotate)
        painter.drawConvexPolygon(pts)
        painter.restore()
    def drawLine(self,painter):
        pass
    def drawText(self,painter):
        painter.save()
        startRad=4
        deltaRad=0.6
        radius=63
        offset=5.5
        import math
        for i in range(self.scaleMajor+1):
            sina=math.sin(startRad-i*deltaRad)
            cosa=math.cos(startRad-i*deltaRad)

            value=math.ceil((1.0*i*((self.maxValue-self.minValue)/self.scaleMajor)+self.minValue))
            strValue=str(int(value))

            textWidth=self.fontMetrics().width(strValue)
            textHeight=self.fontMetrics().height()

            x=radius*cosa-textWidth/2
            y=-radius*sina+textHeight/4

            painter.setFont(self.font)
            painter.setPen(QColor(26,95,95))
            painter.drawText(x-offset,y,strValue+"bar")
        painter.restore()
    def drawTitle(self,painter):
        painter.restore()
        radius=79
        painter.rotate(self.startAngle)
        steps=self.scaleMajor
        angleStep=(360.0-self.startAngle-self.endAngle)/steps

        for i in range(steps+1):
            if i<3:
                color=self.pieColorStart
            elif i<7:
                color=self.pieColorMid
            else:
                color=self.pieColorEnd
            painter.setPen(QPen(color,Qt.SolidLine))
            painter.drawLine(0,radius-5,0,radius)
            painter.rotate(angleStep)
        painter.restore()
if __name__ == '__main__':
    import sys
    app=QApplication(sys.argv)

    win=Window()
    win.show()

   


    sys.exit(app.exec_())

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值