如何在 PyQt 中创建“色环”?

Pyo*_*trK 1 python pyqt python-3.x pyqt5

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

色环
或:
Windows 颜色选择器

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

Tob*_*Tei 5

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

class ColorCircle(QWidget):

    def __init__(self, parent=None) -> None:
        super().__init__(parent=parent)
        self.radius = 0

    def resizeEvent(self, ev: QResizeEvent) -> None:
        self.radius = min([self.width()/2, self.height()/2])

    def paintEvent(self, ev: QPaintEvent) -> None:
        center = QPointF(self.width()/2, self.height()/2)
        p = QPainter(self)
        hsv_grad = QConicalGradient(center, 90)
        for deg in range(360):
            col = QColor.fromHsvF(deg / 360, 1, self.v)
            hsv_grad.setColorAt(deg / 360, col)

        val_grad = QRadialGradient(center, self.radius)
        val_grad.setColorAt(0.0, QColor.fromHsvF(0.0, 0.0, self.v, 1.0))
        val_grad.setColorAt(1.0, Qt.transparent)

        p.setPen(Qt.transparent)
        p.setBrush(hsv_grad)
        p.drawEllipse(self.rect())
        p.setBrush(val_grad)
        p.drawEllipse(self.rect())
Run Code Online (Sandbox Code Playgroud)

可以在这个要点中找到完整功能的版本(带有信号、设置/获取功能)https://gist.github.com/tobi08151405/7b0a8151c9df1a41a87c1559dac1243a