Example #1
0
    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()
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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),
        )
Example #5
0
    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()
Example #6
0
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)
Example #7
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))
Example #9
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
Example #12
0
    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,
        )