Python 如何在PyQt中创建“颜色圈”?
我想创建一个QWidget/QDialog,如下所示: 或: 我知道QColorDialog,但我不想使用它 输出: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:
我知道这是个老问题, 但是,由于唯一的答案是相当糟糕的性能,这里是我的版本。 它使用两个相互叠加的渐变,而不是单独渲染小部件中的每个点 类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()