Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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
Python 如何在PyQt中创建“颜色圈”?_Python_Python 3.x_Pyqt_Pyqt5 - Fatal编程技术网

Python 如何在PyQt中创建“颜色圈”?

Python 如何在PyQt中创建“颜色圈”?,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我想创建一个QWidget/QDialog,如下所示: 或: 我知道QColorDialog,但我不想使用它 输出: 我知道这是个老问题, 但是,由于唯一的答案是相当糟糕的性能,这里是我的版本。 它使用两个相互叠加的渐变,而不是单独渲染小部件中的每个点 类ColorCircleQWidget: 定义初始自我,父项=无->无: super.\uuuu init\uuuu parent=parent 自半径=0 def resizeEventself,ev:QResizeEvent->None:

我想创建一个QWidget/QDialog,如下所示:

或:

我知道QColorDialog,但我不想使用它

输出:


我知道这是个老问题, 但是,由于唯一的答案是相当糟糕的性能,这里是我的版本。 它使用两个相互叠加的渐变,而不是单独渲染小部件中的每个点

类ColorCircleQWidget: 定义初始自我,父项=无->无: super.\uuuu init\uuuu parent=parent 自半径=0 def resizeEventself,ev:QResizeEvent->None: 自半径=最小值[自宽/2,自高/2] def paintEventself,ev:QPaintEvent->None: 中心=QPointFself.width/2,self.height/2 p=QPainterself hsv_梯度=QConicalGradientcenter,90 对于360度范围内的deg: col=QColor.fromHsvFdeg/360,1,自身电压 hsv_梯度设置颜色度数/360,col val_grad=Q半径半径中心,自半径 从HSVF0.0,0.0,self.v,1.0设置颜色为0.0,QColor val_梯度设置颜色为1.0,Qt.透明 p、 setPenQt.transparent p、 哈佛商学院毕业生 p、 Dropellipseself.rect p、 瓦卢格拉德酒店 p、 Dropellipseself.rect 可在此要点中找到具有信号、设置/获取功能的全功能版本

from PyQt5 import QtWidgets, QtCore, QtGui
import sys
import numpy as np

class ColorCircle(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        self.radius = 100.
        self.setFixedSize(200, 200)

    def paintEvent(self, ev):
        super().paintEvent(ev)
        p = QtGui.QPainter(self)
        for i in range(self.width()):
            for j in range(self.height()):
                color = QtGui.QColor(255, 255, 255, 255)
                h = (np.arctan2(i-self.radius, j-self.radius)+np.pi)/(2.*np.pi)
                s = np.sqrt(np.power(i-self.radius, 2)+np.power(j-self.radius, 2))/self.radius
                v = 1.0
                if s < 1.0:
                    color.setHsvF(h, s, v, 1.0)
                p.setPen(color)
                p.drawPoint(i, j)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = ColorCircle()
    w.show()
    app.exec()