Пример #1
0
    def save_image_to(self,
                      path,
                      top_margin=50,
                      bottom_margin=50,
                      left_margin=50,
                      right_margin=50):

        margins = QMarginsF(left_margin, top_margin, right_margin,
                            bottom_margin)

        oldRect = self.scene().sceneRect()
        minRect = self.scene().itemsBoundingRect()
        imgRect = minRect.marginsAdded(margins)

        image = QImage(imgRect.size().toSize(), QImage.Format_ARGB32)
        image.fill(Qt.white)
        painter = QPainter(image)

        painter.setRenderHints(QPainter.Antialiasing
                               | QPainter.SmoothPixmapTransform
                               | QPainter.HighQualityAntialiasing)

        # draw the image
        self.scene().setSceneRect(imgRect)
        self.scene().render(painter)
        image.save(path)

        # cleanup
        painter.end()

        # restore the old scene rect
        self.scene().setSceneRect(oldRect)
Пример #2
0
    def doubleBufferPaint(self, buffer=None):
        self.blockSignals(True)
        #self.drawFrame(painter)
        if buffer is None:
            buffer = QImage(self.width(), self.height(), QImage.Format_RGB888)
        buffer.fill(Qt.black)
        # calculate offset and scale of droplet image pixmap
        scale_x, scale_y, offset_x, offset_y = self.get_from_image_transform()

        db_painter = QPainter(buffer)
        db_painter.setRenderHints(QPainter.Antialiasing
                                  | QPainter.NonCosmeticDefaultPen)
        db_painter.setBackground(QBrush(Qt.black))
        db_painter.setPen(QPen(Qt.black, 0))
        db_painter.drawPixmap(offset_x, offset_y, self._pixmap)
        pen = QPen(Qt.magenta, 1)
        pen_fine = QPen(Qt.blue, 1)
        pen.setCosmetic(True)
        db_painter.setPen(pen)
        # draw droplet outline and tangent only if evaluate_droplet was successful
        if self._droplet.is_valid:
            try:
                # transforming true image coordinates to scaled pixmap coordinates
                db_painter.translate(offset_x, offset_y)
                db_painter.scale(scale_x, scale_y)

                # drawing tangents and baseline
                db_painter.drawLine(*self._droplet.line_l)
                db_painter.drawLine(*self._droplet.line_r)
                db_painter.drawLine(*self._droplet.int_l, *self._droplet.int_r)

                # move origin to ellipse origin
                db_painter.translate(*self._droplet.center)

                # draw diagnostics
                # db_painter.setPen(pen_fine)
                # #  lines parallel to coordinate axes
                # db_painter.drawLine(0,0,20*scale_x,0)
                # db_painter.drawLine(0,0,0,20*scale_y)
                # # angle arc
                # db_painter.drawArc(-5*scale_x, -5*scale_y, 10*scale_x, 10*scale_y, 0, -self._droplet.tilt_deg*16)

                # rotate coordinates to ellipse tilt
                db_painter.rotate(self._droplet.tilt_deg)

                # draw ellipse
                # db_painter.setPen(pen)
                db_painter.drawEllipse(-self._droplet.maj / 2,
                                       -self._droplet.min / 2,
                                       self._droplet.maj, self._droplet.min)

                # # major and minor axis for diagnostics
                # db_painter.drawLine(0, 0, self._droplet.maj/2, 0)
                # db_painter.drawLine(0, 0, 0, self._droplet.min/2)
            except Exception as ex:
                logging.error(ex)
        db_painter.end()
        self.blockSignals(False)
        return buffer
    def paintEvent(self, event: QPaintEvent) -> None:
        painter = QPainter(self)
        painter.setRenderHints(QPainter.Antialiasing
                               | QPainter.TextAntialiasing)

        # 1: 绘制当前进度; 否则绘制按钮背景
        if 1 is self.__status: self.drawProgress(painter)
        else: self.drawBg(painter)
Пример #4
0
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHints(QPainter.Antialiasing, True)

        for p in self.tempPolygons:
            self.drawPolygon(painter, p)

        self.drawLines(painter, self.tempPoints)

        return super().paintEvent(event)
Пример #5
0
    def paintEvent(self, event):
        """Paint the background, range bar and splitters.

        Parameters
        ----------
        event : PySide2.QEvent
            Event from the Qt context.
        """
        painter, w, h = QPainter(self), self.width(), self.height()

        half_width = self.slider_width / 2
        halfdiff = int(w / 2 - half_width)
        # Background
        painter.setPen(self.background_color)
        painter.setBrush(self.background_color)
        painter.drawRoundedRect(halfdiff, 0, self.slider_width, h, 2, 2)

        # Range Bar
        painter.setPen(self.bar_color)
        painter.setBrush(self.bar_color)
        if self.collapsed:
            painter.drawRect(
                halfdiff,
                h - self.display_max,
                self.slider_width,
                self.display_max,
            )
        else:
            painter.drawRect(
                halfdiff,
                h - self.display_max,
                self.slider_width,
                self.display_max - self.display_min,
            )

        painter.setRenderHints(QPainter.Antialiasing)
        # Splitters
        painter.setPen(self.handle_border_color)
        painter.setBrush(self.handle_color)
        painter.drawEllipse(
            int(w / 2 - self.handle_radius),
            h - self.display_min - self.handle_radius,
            self.handle_width,
            self.handle_width,
        )  # upper
        painter.drawEllipse(
            int(w / 2 - self.handle_radius),
            h - self.display_max - self.handle_radius,
            self.handle_width,
            self.handle_width,
        )  # lower
Пример #6
0
    def paintEvent(self, e):
        """ Draws the color bar and arrow """
        if self.item():
            painter = QPainter(self)

            # Draws the color bar
            painter.setPen(Qt.NoPen)
            rect = QRect(0, 0, self.COLOR_BAR_WIDTH, self.COLOR_BAR_HEIGHT)
            painter.fillRect(rect,
                             self.item().data(renderSetupRoles.NODE_COLOR_BAR))
            oldBrush = painter.brush()

            if self.item().type(
            ) == renderSetup.RENDER_OVERRIDE_TYPE and self.item(
            ).isLocalRender():
                diameter = rect.width() - 2
                rect2 = QRect(rect.x() + 1,
                              rect.y() + (rect.height() - diameter) / 2,
                              diameter, diameter)
                brush = painter.brush()
                pen = painter.pen()
                hints = painter.renderHints()

                painter.setRenderHint(QPainter.Antialiasing, on=True)
                painter.setPen(Qt.NoPen)
                painter.setBrush(
                    QBrush(QColor(67, 79, 70), style=Qt.SolidPattern))
                painter.drawEllipse(rect2)

                painter.setRenderHints(hints)
                painter.setPen(pen)
                painter.setBrush(brush)

            # Draws the arrow
            painter.setBrush(self.ARROW_COLOR)
            if self.arrowPoints == BaseDelegate.EXPANDED_ARROW:
                painter.translate(self.EXPANDED_ARROW_OFFSET, 0.0)
            else:
                painter.translate(self.COLLAPSED_ARROW_OFFSET, 0.0)
            painter.drawPolygon(self.arrowPoints)
            painter.setBrush(oldBrush)

            # Draws the node type text
            painter.setPen(QPen(self.item().data(Qt.TextColorRole)))
            text = self.item().data(renderSetupRoles.NODE_TYPE_STR)
            painter.setFont(self.item().data(Qt.FontRole))
            painter.drawText(self.NODE_TYPE_TEXT_RECT, text,
                             QTextOption(Qt.AlignLeft | Qt.AlignVCenter))
Пример #7
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),
        )
Пример #8
0
    def update_scene_drawing(self):
        """
        Render the target scene in an image to be used for minimap painting.
        """
        scene = self._view.scene()
        if scene is None:
            return

        dpr = self._view.devicePixelRatioF()
        self._scene_img = QImage(dpr * self._minimap_scene_rect.width(),
                                 dpr * self._minimap_scene_rect.height(),
                                 QImage.Format_ARGB32)
        self._scene_img.setDevicePixelRatio(dpr)
        self._scene_img.fill(Conf.palette_base)
        self._view.set_extra_render_pass(True)
        painter = QPainter(self._scene_img)
        painter.setRenderHints(QPainter.Antialiasing
                               | QPainter.SmoothPixmapTransform
                               | QPainter.HighQualityAntialiasing)
        scene.render(painter, target=self._minimap_scene_rect)
        self._view.set_extra_render_pass(False)
        self.update()
Пример #9
0
    def paintEvent(self, event: QPaintEvent):
        painter = QPainter()
        painter.begin(self)
        painter.setRenderHints(QPainter.SmoothPixmapTransform)
        pen = QPen(Qt.black, 1, Qt.SolidLine)
        # pen1 = QPen(Qt.black, 2, Qt.SolidLine)
        # painter.setPen(pen1)
        # painter.drawLine(0, 0, self.size().width(), 0)
        # painter.drawLine(0, 0, 0, self.size().height())
        # painter.drawLine(self.size().width(), 0, self.size().width(), self.size().height())
        # painter.drawLine(0, self.size().height(), self.size().width(), self.size().height())
        painter.setPen(pen)

        # 棋盘的大致框架
        for i in range(9):
            painter.drawLine(self.lengths[1], self.lengths[i + 1],
                             self.lengths[5], self.lengths[i + 1])
            painter.drawLine(self.lengths[6], self.lengths[i + 1],
                             self.lengths[10], self.lengths[i + 1])
            # painter.drawLine(self.lengths[5], self.lengths[i + 1], self.lengths[6], self.lengths[i + 1])
            painter.drawLine(self.lengths[i + 1], self.lengths[1],
                             self.lengths[i + 1], self.lengths[9])
        painter.drawLine(self.lengths[5], self.lengths[1], self.lengths[6],
                         self.lengths[1])
        painter.drawLine(self.lengths[5], self.lengths[i + 1], self.lengths[6],
                         self.lengths[i + 1])
        painter.drawLine(self.lengths[i + 2], self.lengths[1],
                         self.lengths[i + 2], self.lengths[9])

        # 兵下面的图形
        # pen1 = QPen(Qt.red, 2, Qt.SolidLine)
        # painter.setPen(pen1)
        for j in (4, 7):
            for i in range(0, 9, 2):
                if i != 0:
                    # 右上
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] + 10,
                                     self.lengths[i + 1] - 5)
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] + 5,
                                     self.lengths[i + 1] - 10)
                    # 左上
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] - 10,
                                     self.lengths[i + 1] - 5)
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] - 5,
                                     self.lengths[i + 1] - 10)
                    pass
                if i != 8:
                    # 右下
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] + 10,
                                     self.lengths[i + 1] + 5)
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] + 5,
                                     self.lengths[i + 1] + 10)
                    # 左下
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] - 10,
                                     self.lengths[i + 1] + 5)
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] - 5,
                                     self.lengths[i + 1] + 10)

        # 炮下面的图形
        for j in (3, 8):
            for i in (1, 7):
                if i != 0:
                    # 右上
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] + 10,
                                     self.lengths[i + 1] - 5)
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] + 5,
                                     self.lengths[i + 1] - 10)
                    # 左上
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] - 10,
                                     self.lengths[i + 1] - 5)
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] - 5,
                                     self.lengths[j] - 5,
                                     self.lengths[i + 1] - 10)
                    pass
                if i != 8:
                    # 右下
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] + 10,
                                     self.lengths[i + 1] + 5)
                    painter.drawLine(self.lengths[j] + 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] + 5,
                                     self.lengths[i + 1] + 10)
                    # 左下
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] - 10,
                                     self.lengths[i + 1] + 5)
                    painter.drawLine(self.lengths[j] - 5,
                                     self.lengths[i + 1] + 5,
                                     self.lengths[j] - 5,
                                     self.lengths[i + 1] + 10)

        # 士所走的 X
        for j in (2, 9):
            for i in (4, ):
                painter.drawLine(self.lengths[j] - self.length,
                                 self.lengths[i + 1] - self.length,
                                 self.lengths[j] + self.length,
                                 self.lengths[i + 1] + self.length)
                painter.drawLine(self.lengths[j] - self.length,
                                 self.lengths[i + 1] + self.length,
                                 self.lengths[j] + self.length,
                                 self.lengths[i + 1] - self.length)
        painter.end()
Пример #10
0
    def paint(self, painter: QPainter, option: QStyleOptionViewItem,
              index: QModelIndex) -> None:
        painter.setRenderHints(QPainter.Antialiasing)
        node: NavModel.TreeNode = index.data(Qt.UserRole)

        # 定义变量存储区域
        optionRect: QRect = option.rect
        x: int = optionRect.x()
        y: int = optionRect.y()
        width: int = optionRect.width()
        height: int = optionRect.height()

        fontSize: int = self.__nav.parentFontSize

        parent: bool = node.level == 1  # 父节点和子节点颜色分开设置

        # 根据不同的状态设置不同的颜色 bgColor-主背景色 textColor-主文字颜色 tipBgColor-提示信息背景颜色 tipTextColor-提示信息文字颜色
        if option.state & QStyle.State_Selected:
            bgColor = self.__nav.parentBgSelectedColor if parent else self.__nav.childBgSelectedColor
            textColor = self.__nav.parentTextSelectedColor if parent else self.__nav.childTextSelectedColor
            tipBgColor = self.__nav.parentTextSelectedColor if parent else self.__nav.childTextSelectedColor
            tipTextColor = self.__nav.parentBgSelectedColor if parent else self.__nav.childBgSelectedColor
            # iconColor = self.__nav.parentTextSelectedColor if parent else self.__nav.childTextSelectedColor
        elif option.state & QStyle.State_MouseOver:
            bgColor = self.__nav.parentBgHoverColor if parent else self.__nav.childBgHoverColor
            textColor = self.__nav.parentTextHoverColor if parent else self.__nav.childTextHoverColor
            tipBgColor = self.__nav.parentTextSelectedColor if parent else self.__nav.childTextSelectedColor
            tipTextColor = self.__nav.parentBgSelectedColor if parent else self.__nav.childBgSelectedColor
            # iconColor = self.__nav.parentTextHoverColor if parent else self.__nav.childTextHoverColor
        else:
            bgColor = self.__nav.parentBgNormalColor if parent else self.__nav.childBgNormalColor
            textColor = self.__nav.parentTextNormalColor if parent else self.__nav.childTextNormalColor
            tipBgColor = self.__nav.parentBgSelectedColor if parent else self.__nav.childBgSelectedColor
            tipTextColor = self.__nav.parentTextSelectedColor if parent else self.__nav.childTextSelectedColor
            # iconColor = self.__nav.parentTextNormalColor if parent else self.__nav.childTextNormalColor

        painter.fillRect(optionRect, bgColor)  # 绘制背景

        # 绘制线条,目前限定子节点绘制,如果需要父节点也绘制则取消parent判断即可
        lineWidth: int = self.__nav.lineWidth
        if not parent and self.__nav.lineVisible and lineWidth > 0:
            if (option.state & QStyle.State_Selected) or (
                    option.state & QStyle.State_MouseOver):
                offset: float = lineWidth / 2  # 设置偏移量,不然上下部分会有点偏移

                # 计算上下两个坐标点
                pointTop = QPointF(x, y + offset)
                pointBottom = QPointF(x, height + y - offset)
                if not self.__nav.lineLeft:
                    pointTop.setX(width)
                    pointBottom.setX(width)

                # 设置线条颜色和宽度
                painter.setPen(QPen(self.__nav.lineColor, lineWidth))
                painter.drawLine(pointTop, pointBottom)

        # 绘制三角形,目前限定子节点绘制,如果需要父节点也绘制则取消parent判断即可
        triangleWidth: int = self.__nav.triangleWidth
        if not parent and self.__nav.triangleVisible and triangleWidth > 0:
            if (option.state & QStyle.State_Selected) or (
                    option.state & QStyle.State_MouseOver):
                font: QFont = self.__iconFont
                font.setPixelSize(fontSize + triangleWidth)
                painter.setFont(font)
                painter.setPen(self.__nav.triangleColor)

                # 采用图形字体中的三角形绘制
                if self.__nav.triangleLeft:
                    painter.drawText(optionRect,
                                     Qt.AlignLeft | Qt.AlignVCenter,
                                     chr(0xf0da))
                else:
                    painter.drawText(optionRect,
                                     Qt.AlignRight | Qt.AlignVCenter,
                                     chr(0xf0d9))

        # 绘制行分隔符
        if self.__nav.separateVisible:
            if node.level == 1 or node.level == 2 and node.last:
                painter.setPen(
                    QPen(self.__nav.separateColor, self.__nav.separateHeight))
                painter.drawLine(QPointF(x, y + height),
                                 QPointF(x + width, y + height))

        # 绘制文字,如果文字为空则不绘制
        text: str = node.text
        if text != '':
            # 文字离左边的距离+字体大小
            margin: int = self.__nav.parentMargin
            if node.level == 2:
                margin = self.__nav.childMargin
                fontSize = self.__nav.childFontSize

            # 计算文字区域
            textRect: QRect = optionRect.__copy__()
            textRect.setWidth(width - margin)
            textRect.setX(x + margin)

            font: QFont = QFont()
            font.setPixelSize(fontSize)
            painter.setFont(font)
            painter.setPen(textColor)
            painter.drawText(textRect, Qt.AlignLeft | Qt.AlignVCenter, text)

        # 绘制提示信息,如果不需要显示提示信息或者提示信息为空则不绘制
        tip: str = node.tip

        if self.__nav.tipVisible and tip != '':
            # 如果是数字则将超过999的数字显示成 999+
            # 如果显示的提示信息长度过长则将多余显示成省略号.
            try:
                if int(tip) > 0:
                    tip = "999+" if int(tip) > 999 else tip
            except ValueError:
                if len(tip) > 2:
                    tip = tip[:2] + " ."

            # 计算绘制区域,半径取高度的四分之一
            radius: int = height // 4
            tipRect: QRect = optionRect.__copy__()
            tipRect.setHeight(radius * 2)
            tipRect.moveCenter(optionRect.center())
            tipRect.setLeft(optionRect.right() - self.__nav.tipWidth - 5)
            tipRect.setRight(optionRect.right() - 5)

            # 设置字体大小
            font: QFont = QFont()
            font.setPixelSize(fontSize - 2)
            painter.setFont(font)

            # 绘制提示文字的背景
            painter.setPen(Qt.NoPen)
            painter.setBrush(tipBgColor)
            painter.drawRoundedRect(tipRect, radius, radius)

            # 绘制提示文字
            painter.setPen(tipTextColor)
            painter.setBrush(Qt.NoBrush)
            painter.drawText(tipRect, Qt.AlignCenter, tip)

        # 计算绘制图标区域
        iconRect: QRect = optionRect.__copy__()
        iconRect.setLeft(self.__nav.parentIconMargin if parent else self.__nav.
                         childIconMargin)

        # 设置图形字体和画笔颜色
        font: QFont = self.__iconFont
        font.setPixelSize(fontSize)
        painter.setFont(font)
        painter.setPen(textColor)

        # 绘制左侧图标,有图标则绘制图标,没有的话父窗体取 + -
        if node.icon != '':
            painter.drawText(iconRect, Qt.AlignLeft | Qt.AlignVCenter,
                             node.icon)
        elif parent:
            if node.expand:
                painter.drawText(iconRect, Qt.AlignLeft | Qt.AlignVCenter,
                                 chr(0xf067))
            else:
                painter.drawText(iconRect, Qt.AlignLeft | Qt.AlignVCenter,
                                 chr(0xf068))

        # 绘制父节点右侧图标
        iconRect.setRight(optionRect.width() - 10)
        if not (self.__nav.tipVisible
                and node.tip != '') and self.__nav.rightIconVisible and parent:
            if node.expand:
                painter.drawText(iconRect, Qt.AlignRight | Qt.AlignVCenter,
                                 chr(0xf054))
            else:
                painter.drawText(iconRect, Qt.AlignRight | Qt.AlignVCenter,
                                 chr(0xf078))