def showEvent(self, event: QShowEvent = None) -> None: # 首次显示记住当前背景截图,用于获取颜色值 self.__bgPix = QPixmap(self.width(), self.height()) self.__bgPix.fill(Qt.transparent) painter: QPainter = QPainter() painter.begin(self.__bgPix) linearGradient: QLinearGradient = QLinearGradient() if self.__hsbMode: # 起始坐标和结束坐标换个位置可改变颜色顺序 linearGradient.setStart( QPoint(self.__bgRect.x(), self.__bgRect.height())) linearGradient.setFinalStop( QPoint(self.__bgRect.x(), self.__bgRect.y())) # 由下往上,饱和度百分值由0增加到1.0 for i in [i * 0.0625 for i in range(17)]: linearGradient.setColorAt(i, QColor.fromHsvF(i, 1, 1, 1)) else: linearGradient.setStart(QPointF(0, 0)) linearGradient.setFinalStop(QPointF(0, self.height())) linearGradient.setColorAt(0.0, self.__topColor) linearGradient.setColorAt(1.0, self.__bottomColor) painter.setPen(Qt.NoPen) painter.setBrush(linearGradient) rect: QRect = QRect(self.__borderWidth // 2, self.__borderWidth // 2, self.width() - self.__borderWidth, self.height() - self.__borderWidth) painter.drawRect(rect) painter.end() self.initColor()
def colorChangedHSB(self, color: QColor, hue: float, sat: float) -> None: self.colorPanelBar.topColor = color self.colorPanelBar.borderColor = color self.btnHue.text = "Hue\n%0.1f" % round(hue, 1) self.btnSat.text = "Sat\n%0.1f" % round(sat, 1) self.btnBright.text = "Bright\n%0.1f" % round( self.colorPanelBar.percent, 1) c: QColor = QColor.fromHsvF(hue / 360, sat / 100, self.colorPanelBar.percent / 100) self.setColor(c)
def __init__( self, default_node_panel_factory: "providers.Factory", name="NodesWindow", parent: "QWidget" = None, ): super().__init__(parent) self.name = name self.color_identifier = QColor.fromHsvF(random.random(), 0.65, 0.6) self.__default_node_panel_factory = default_node_panel_factory self.__node_panels = {} self.__background_widget = QWidget() self.__background_widget.setFixedWidth(0) self.setCentralWidget(self.__background_widget)
def paintEvent(self, event): """Overridden method. Paint gauge as series of lines, and adds text labels.""" painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) swidth = max(self.width() - 100, 20) sheight = self.height() if self._min == self._max: painter.setBrush(QBrush(Qt.red, Qt.DiagCrossPattern)) painter.drawRect(0, 0, swidth, sheight) painter.setPen(Qt.black) if self._min is not None: painter.drawText( 0, 0, self.width() - swidth, sheight, Qt.AlignCenter, "{0:.2f}".format(self._min), ) return for x in range(0, sheight): painter.setPen( QColor.fromHsvF((x / sheight) * 0.7, min(1, 1.5 - (x / sheight)), 1) ) painter.drawLine(0, x, swidth, x) painter.setPen(Qt.black) painter.drawText( 0, 0, self.width() - swidth, 30, Qt.AlignCenter, "{0:.2f}".format(self._max), ) painter.drawText( 0, sheight - 30, self.width() - swidth, 30, Qt.AlignCenter, "{0:.2f}".format(self._min), )
def drawBg(self, painter: QPainter) -> None: painter.save() # 不可用背景灰色 if self.isEnabled(): linearGradient: QLinearGradient = QLinearGradient() if self.__hsbMode: # 起始坐标和结束坐标换个位置可改变颜色顺序 linearGradient.setStart( QPoint(self.__bgRect.x(), self.__bgRect.height())) linearGradient.setFinalStop( QPoint(self.__bgRect.x(), self.__bgRect.y())) # 由下往上,饱和度百分值由0增加到1.0 for i in [i * 0.0625 for i in range(17)]: linearGradient.setColorAt(i, QColor.fromHsvF(i, 1, 1, 1)) painter.setPen(Qt.NoPen) else: linearGradient.setStart(QPointF(0, 0)) linearGradient.setFinalStop(QPointF(0, self.height())) linearGradient.setColorAt(0.0, self.__topColor) linearGradient.setColorAt(1.0, self.__bottomColor) pen: QPen = QPen() pen.setWidthF(self.__borderWidth) pen.setColor(self.__borderColor) pen.setCapStyle(Qt.RoundCap) pen.setJoinStyle(Qt.RoundJoin) painter.setPen(pen) painter.setBrush(linearGradient) else: painter.setPen(Qt.NoPen) painter.setBrush(self.__disableColor) painter.drawRoundedRect(self.__bgRect, self.__borderRadius, self.__borderRadius) painter.restore()
def color_from_index(i, count, base_hue=0.0, saturation=1.0): golden_ratio = 0.618033988749895 h = golden_ratio * (360 / count) * i h = ((base_hue + h) % 360) / 360 # return QColor.fromHsvF(217 / 360, 0.60, 1.0, 1.0) return QColor.fromHsvF(h, saturation, 1.0, 1.0)
def setUp(self): self.original = QColor.fromHsvF(0.2, 0.3, 0.4, 0.5)
def testReduceHsv(self): self.reduceColor(QColor.fromHsvF(0.1, 0.2, 0.3, 0.4))
def updateColor(self, color: QColor, value: float, percent: float) -> None: item: ColorPanelBar = self.sender() index: int = self.__items.index(item) if index is 0: # 获取当前HSB处的颜色值 self.__items[1].topColor = color self.__items[2].topColor = color self.__items[1].borderColor = color self.__items[2].borderColor = color elif index is 1: self.__items[2].topColor = color self.__items[2].borderColor = color elif index is 2: self.__items[1].topColor = color self.__items[1].borderColor = color elif index == 3: self.__items[6].percent = 100 - percent elif index == 4: self.__items[7].percent = 100 - percent elif index == 5: self.__items[8].percent = 100 - percent elif index == 6: self.__items[3].percent = 100 - percent elif index == 7: self.__items[4].percent = 100 - percent elif index == 8: self.__items[5].percent = 100 - percent # 如果是HSB变化则CMY和RGB变化 if index < 3: hue: float = self.__items[0].percent / 100 sat: float = self.__items[1].percent / 100 bright: float = self.__items[2].percent / 100 # 组合HSB当前值,然后转为CMY和RGB计算百分比进行设置 color: QColor = QColor.fromHsvF(hue, sat, bright) percentRed: float = color.redF() * 100 percentGreen: float = color.greenF() * 100 percentBlue: float = color.blueF() * 100 self.__items[3].percent = 100 - percentRed self.__items[4].percent = 100 - percentGreen self.__items[5].percent = 100 - percentBlue self.__items[6].percent = percentRed self.__items[7].percent = percentGreen self.__items[8].percent = percentBlue # 根据百分比获取颜色值 red: float = self.__items[6].percent / 100 green: float = self.__items[7].percent / 100 blue: float = self.__items[8].percent / 100 currentColor: QColor = QColor.fromRgbF(red, green, blue) self.colorChanged.emit(currentColor, self.__items[0].value, self.__items[1].percent, self.__items[2].percent) # 如果是CMY或者RGB变化则HSB变化 if index >= 3: # hue活出现负数=白色,要矫正 percentHue: float = currentColor.hueF() * 100 if percentHue < 0: percentHue = 0 percentSat: float = currentColor.saturationF() * 100 percentBright: float = currentColor.lightnessF() * 100 # 计算当前值所占百分比 self.__items[0].percent = percentHue self.__items[1].percent = percentSat self.__items[2].percent = percentBright self.__items[1].topColor = currentColor self.__items[2].topColor = currentColor self.__items[1].borderColor = currentColor self.__items[2].borderColor = currentColor
def paint(self, painter, option, widget): """Paint actuator. Overridden method.""" # if range isn't set, don't draw if self._min is None or self._max is None: return painter.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) # paint grayed circle for actuators not providing the selected value if self._state == self.STATE_INACTIVE: painter.setPen(QPen(Qt.gray, self._scale, Qt.DotLine)) painter.drawEllipse(self._center, 10 * self._scale, 10 * self._scale) return # draw rectangle around selected actuator if self._selected: painter.setPen(QPen(Qt.black, self._scale)) painter.drawRect(self.boundingRect()) else: painter.setPen(QPen(Qt.red, self._scale)) # draw selected actuator in red color if self._state == self.STATE_WARNING: painter.setBrush(Qt.red) # if range span is 0, fill with dotted pattern elif self._min == self._max: brush = QBrush(Qt.red, Qt.DiagCrossPattern) brush.setTransform(QTransform().scale(self._scale / 3, self._scale / 3)) painter.setBrush(brush) # draw using value as index into possible colors in HSV model else: hue = 1 - (self._data - self._min) / (self._max - self._min) painter.setBrush(QColor.fromHsvF(hue * 0.7, min(1, 1.5 - hue), 1)) # draw actuator, write value painter.drawEllipse(self._center, 10 * self._scale, 10 * self._scale) painter.setPen(Qt.black) font = painter.font() font.setPixelSize(6.5 * self._scale) font.setItalic(True) painter.setFont(font) painter.drawText( self._center.x() - 10 * self._scale, self._center.y() - 10 * self._scale, 20 * self._scale, 10 * self._scale, Qt.AlignBottom | Qt.AlignHCenter, str(self.id), ) vstr = f"{self.data:.2f}" if len(vstr) > 6: font.setPixelSize(3.5 * self._scale) elif len(vstr) > 3: font.setPixelSize(4.5 * self._scale) font.setItalic(False) font.setBold(True) painter.setFont(font) # draw value painter.drawText( self._center.x() - 10 * self._scale, self._center.y(), 20 * self._scale, 10 * self._scale, Qt.AlignTop | Qt.AlignHCenter, vstr, )