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)
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)
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)
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
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))
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 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()
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()
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))