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_())