Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyqt 如何创建三色渐变千分表(显示绿-黄-红的千分表)_Pyqt - Fatal编程技术网

Pyqt 如何创建三色渐变千分表(显示绿-黄-红的千分表)

Pyqt 如何创建三色渐变千分表(显示绿-黄-红的千分表),pyqt,Pyqt,因此,我有一个拨号图像,用于PyQt小部件。现在,正如你所看到的,渐变指示器,绿-黄-红的弧线是静态的,是图像的一部分 我想动态地创建它,以便根据一些范围确定颜色。例如,我可能希望它的60度左右为红色,其余部分为绿色和黄色,而不是等分的绿色和红色。为此,我将指定一些范围(例如,0-90度应为绿色等) 有没有办法画出如此弯曲的渐变色 要实现这一点,一种方法是创建一个小部件并执行定制的paintEvent。您将使用以下几个元素建立此结果: 绘制仪表背景的静态pixmap 用渐变绘制一个饼图形状 用原

因此,我有一个拨号图像,用于PyQt小部件。现在,正如你所看到的,渐变指示器,绿-黄-红的弧线是静态的,是图像的一部分

我想动态地创建它,以便根据一些范围确定颜色。例如,我可能希望它的60度左右为红色,其余部分为绿色和黄色,而不是等分的绿色和红色。为此,我将指定一些范围(例如,0-90度应为绿色等)


有没有办法画出如此弯曲的渐变色

要实现这一点,一种方法是创建一个小部件并执行定制的paintEvent。您将使用以下几个元素建立此结果:

  • 绘制仪表背景的静态pixmap
  • 用渐变绘制一个饼图形状
  • 用原始图像重新填充中心,以再次将其剪切
  • 您需要在init中缓存一次pixmap,这样就不会一直从磁盘创建它。然后,您可以为小部件提供一种方法来设置
    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
    ,以进行更多的绘制。