Pyqt 如何创建三色渐变千分表(显示绿-黄-红的千分表)
因此,我有一个拨号图像,用于PyQt小部件。现在,正如你所看到的,渐变指示器,绿-黄-红的弧线是静态的,是图像的一部分 我想动态地创建它,以便根据一些范围确定颜色。例如,我可能希望它的60度左右为红色,其余部分为绿色和黄色,而不是等分的绿色和红色。为此,我将指定一些范围(例如,0-90度应为绿色等)Pyqt 如何创建三色渐变千分表(显示绿-黄-红的千分表),pyqt,Pyqt,因此,我有一个拨号图像,用于PyQt小部件。现在,正如你所看到的,渐变指示器,绿-黄-红的弧线是静态的,是图像的一部分 我想动态地创建它,以便根据一些范围确定颜色。例如,我可能希望它的60度左右为红色,其余部分为绿色和黄色,而不是等分的绿色和红色。为此,我将指定一些范围(例如,0-90度应为绿色等) 有没有办法画出如此弯曲的渐变色 要实现这一点,一种方法是创建一个小部件并执行定制的paintEvent。您将使用以下几个元素建立此结果: 绘制仪表背景的静态pixmap 用渐变绘制一个饼图形状 用原
有没有办法画出如此弯曲的渐变色 要实现这一点,一种方法是创建一个小部件并执行定制的paintEvent。您将使用以下几个元素建立此结果:
0.0-1.0
中的值
class GaugeWidget(QtGui.QWidget):
定义初始化(self,initialValue=0,*args,**kwargs):
超级(标准尺,自我)。(初始值(*args,**kwargs)
self._bg=QtGui.QPixmap(“bg.png”)
self.setValue(初始值)
def设置值(自身,val):
val=浮动(最小值(最大值(val,0),1))
自身值=-270*val
self.update()
def paintEvent(自身,事件):
painter=QtGui.QPainter(自)
painter.setRenderHint(painter.Antialiasing)
rect=event.rect()
仪表校正=QtCore.QRect(校正)
尺寸=量规直径尺寸()
位置=仪表的直线中心()
量规垂直移动中心(QtCore.QPoint(位置x()-size.width(),位置y()-size.height())
仪表直接设置尺寸(尺寸*.9)
仪表直线移动中心(位置)
重新填充=QtCore.QRect(量规)
大小=重新填充正确的大小()
pos=重新加注直线中心()
重新填充直线移动中心(QtCore.QPoint(位置x()-size.width(),位置y()-size.height())
#小于.9==更厚的仪表
重新加注直接设置尺寸(尺寸*.9)
重新加注直接移动中心(位置)
painter.setPen(QtCore.Qt.NoPen)
画师。drawPixmap(矩形、自形)
保存
梯度=QtGui.QConicalGradient(QtCore.QPointF(gauge_rect.center()),270.0)
梯度setColorAt(.75,QtCore.Qt.green)
梯度setColorAt(.5,QtCore.Qt.黄色)
梯度setColorAt(.25,QtCore.Qt.red)
画家。挫折(毕业生)
油漆工图纸(量规直径225.0*16,自身值*16)
恢复
painter.setBrush(QtGui.QBrush(self.\u bg.scaled(rect.size()))
油漆工抽屉(重新加注)
超级(测量边缘,自我)。油漆事件(事件)
通过公开一种设置颜色的方法,甚至可以更改开始和结束范围,您可以进一步扩展这个小部件。它们将是paintEvent将引用的属性,就像它现在使用的value属性一样
还可以调整颜色停止值以更改范围的平衡
确保paintEvent尽可能少地进行处理 哦,哇。非常感谢你。我把你的代码放在我的程序中,它生成了这样的东西:(不介意数字等粗糙的东西)我可以看到梯度曲线在那里!但是图像有点乱,我不知道为什么。有什么建议吗?我已经将窗口的几何设置为
(0,0,700,700)
,这种硬编码会有问题吗?嗯。我现在无法测试,但你能用600x600图像和600x600窗口检查它是否正确吗?在这个例子中,除了缩小尺寸以适应嵌框外,它没有做任何尺寸假设。如果你能举一个简单的例子来说明这个问题,我可以看看itI,我试过600x600窗口,不起作用。我也不明白哪里出了问题。这是它的一个粘贴箱,它几乎完全是你的代码,只是添加了一些我的代码:好吧,这是奇怪的事情。我正在玩生成的window+图像,当我调整窗口大小时,扭曲消失了。即使我将它调整回原来的大小,它也消失了。但是,在我最小化窗口并再次打开它之后,扭曲又回来了。下面是一个更正的版本,它没有任何工件供我使用:。您应该保留量规边线,使其可以作为组件添加到任何其他布局中。我将您的示例
用作“窗口”,并将量规边线
添加到布局中。如果要同时绘制文本标签,则可以展开GaugeWidget
的paintEvent
,以进行更多的绘制。