def drawOverlay(self, painter: QPainter) -> None: if not self.__showOverlay: return radius: int = 80 painter.save() painter.setPen(Qt.NoPen) smallCircle: QPainterPath = QPainterPath() bigCircle: QPainterPath = QPainterPath() radius -= 1 smallCircle.addEllipse(-radius, -radius, radius * 2, radius * 2) radius *= 2 bigCircle.addEllipse(-radius, -radius + 140, radius * 2, radius * 2) # 高光的形状为小圆扣掉大圆的部分 highlight: QPainterPath = smallCircle - bigCircle linearGradient: QLinearGradient = QLinearGradient(0, -radius / 2, 0, 0) self.__overlayColor.setAlpha(100) linearGradient.setColorAt(0.0, self.__overlayColor) self.__overlayColor.setAlpha(30) linearGradient.setColorAt(1.0, self.__overlayColor) painter.setBrush(linearGradient) painter.rotate(-20) painter.drawPath(highlight) painter.restore()
def drawOverlay(self, painter: QPainter) -> None: # 如果没有启用绘制遮住颜色或者当前不可用则不用绘制 if not self.__showOverlay or not self.isEnabled(): return painter.save() # 根据当前百分比计算高度 width: int = self.__bgRect.width() - self.__borderWidth height: int = self.__bgRect.height() - self.__borderWidth height = int(height - (self.__percent / 100) * height) if self.__outMode: overlayRect = QRect(self.__borderWidth, self.__borderWidth + self.__percentHeight // 2, width, height) else: overlayRect = QRect(self.__borderWidth, self.__borderWidth, width, height) painter.setPen(Qt.NoPen) painter.setBrush(self.__overlayColor) painter.drawRect(overlayRect) painter.restore()
def drawPercent(self, painter: QPainter) -> None: painter.save() # 百分比选择框的区域要小于边框宽度,同时偏移一点,是的看起来美观 offset: int = self.__borderWidth + 2 y: int = int(self.__rightHeight * (1 - self.__percent / 100)) # 禁用状态颜色要变暗 pen: QPen = QPen() pen.setWidthF(self.__percentBorder) pen.setColor(self.__percentColor if self.isEnabled() else self. __disableColor.name()) painter.setPen(pen) painter.setBrush(QColor(0, 0, 0, 50)) rect: QRect = QRect(offset, y + offset, self.width() - offset * 2, self.__percentHeight) painter.drawRoundedRect(rect, self.__percentRadius, self.__percentRadius) textFont: QFont = QFont() textFont.setPixelSize(rect.width() // 3) painter.setFont(textFont) if self.__showValue: painter.drawText(rect, Qt.AlignCenter, '%d' % round(self.__value)) else: painter.drawText(rect, Qt.AlignCenter, '%d%%' % round(self.__percent)) painter.restore()
def drawTriangle(self, painter: QPainter) -> None: if not self.__showTriangle: return painter.save() painter.setPen(Qt.NoPen) painter.setBrush(self.__triangleColor) # 绘制在右侧中间,根据设定的倒三角的边长设定三个点位置 width: int = self.width() height: int = self.height() midWidth: int = width // 2 midHeight: int = height // 2 pts: QPolygon = QPolygon() if self.__trianglePosition == NavLabel.TrianglePosition.TrianglePosition_Left: pts.append(QPoint(self.__triangleLen, midHeight)) pts.append(QPoint(0, midHeight - self.__triangleLen)) pts.append(QPoint(0, midHeight + self.__triangleLen)) elif self.__trianglePosition == NavLabel.TrianglePosition.TrianglePosition_Right: pts.append(QPoint(width - self.__triangleLen, midHeight)) pts.append(QPoint(width, midHeight - self.__triangleLen)) pts.append(QPoint(width, midHeight + self.__triangleLen)) elif self.__trianglePosition == NavLabel.TrianglePosition.TrianglePosition_Top: pts.append(QPoint(midWidth, self.__triangleLen)) pts.append(QPoint(midWidth - self.__triangleLen, 0)) pts.append(QPoint(midWidth + self.__triangleLen, 0)) elif self.__trianglePosition == NavLabel.TrianglePosition.TrianglePosition_Bottom: pts.append(QPoint(midWidth, height - self.__triangleLen)) pts.append(QPoint(midWidth - self.__triangleLen, height)) pts.append(QPoint(midWidth + self.__triangleLen, height)) painter.drawPolygon(pts) painter.restore()
def drawTitle(self, painter: QPainter) -> None: painter.save() painter.setPen(Qt.NoPen) painter.setBrush(self.__tempColor) offset: int = self.__borderWidth - self.__borderWidth // 3 rect: QRect = QRect(offset, offset, self.width() - offset * 2, self.__titleHeight) painter.drawRect(rect) # 绘制标题文字 if self.__isEnable: painter.setPen(self.__alarmTextColor if self.__isAlarm else self.__titleColor) else: painter.setPen(self.__titleDisableColor) painter.setFont(self.__titleFont) # 文字区域要重新计算 offset = self.__borderWidth * 3 textRect: QRect = QRect(offset, 0, self.width() - offset * 2, self.__titleHeight) align: Qt.Alignment = Qt.Alignment if self.__titleAlignment == PanelItem.Alignment.Alignment_Left: align = Qt.AlignLeft | Qt.AlignVCenter elif self.__titleAlignment == PanelItem.Alignment.Alignment_Center: align = Qt.AlignHCenter | Qt.AlignVCenter elif self.__titleAlignment == PanelItem.Alignment.Alignment_Right: align = Qt.AlignRight | Qt.AlignVCenter painter.drawText(textRect, align, self.__titleText) painter.restore()
def drawArc(self, painter: QPainter, radius: int, angle: float, arc_color: QColor) -> None: painter.save() painter.setPen(Qt.NoPen) smallradius: int = radius - self.__radiusWidth maxRaidus: int = radius + self.__shadowWidth minRadius: int = smallradius - self.__shadowWidth # 采用圆形渐变,形成光晕效果 radialGradient: QRadialGradient = QRadialGradient( QPointF(0, 0), maxRaidus) color: QColor = arc_color lightColor: QColor = arc_color.name() color.setAlphaF(0) radialGradient.setColorAt(0, color) radialGradient.setColorAt(minRadius * 1.0 / maxRaidus, color) color.setAlphaF(0.5) radialGradient.setColorAt(smallradius * 1.0 / maxRaidus, color) radialGradient.setColorAt((smallradius + 1) * 1.0 / maxRaidus, lightColor) radialGradient.setColorAt((radius - 1) * 1.0 / maxRaidus, lightColor) radialGradient.setColorAt(radius * 1.0 / maxRaidus, color) color.setAlphaF(0) radialGradient.setColorAt(1, color) painter.setBrush(QBrush(radialGradient)) painter.drawPie(-maxRaidus, -maxRaidus, maxRaidus * 2, maxRaidus * 2, 90 * 16, int(-angle * 16)) painter.restore()
def drawText(self, painter: QPainter) -> None: painter.save() painter.setPen(Qt.NoPen) font: QFont = QFont() font.setBold(True) font.setPointSize(10) painter.setFont(font) now: QDateTime = QDateTime.currentDateTime() fm: QFontMetricsF = QFontMetricsF(font) textList: List[AnyStr] = [ now.toString("MM月dd日yyyy"), now.toString("hh:mm:ss.zzz") ] # 绘制文本路径 textPath: QPainterPath = QPainterPath() textPath.addText(-fm.width(textList[0]) / 2.0, -fm.lineSpacing() / 2.0, font, textList[0]) textPath.addText(-fm.width(textList[1]) / 2.0, fm.lineSpacing() / 2.0, font, textList[1]) strokeColor: QColor = self.__textColor.light(80) strokeColor.setAlphaF(0.2) painter.strokePath( textPath, QPen(strokeColor, self.__shadowWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)) painter.setBrush(self.__textColor) painter.drawPath(textPath) painter.restore()
def paintEvent(self, event: QPaintEvent): p = QPainter(self) p.setBrush(QtCore.Qt.blue) taille = min(self.width(), self.height()) p.drawRect(10, 10, taille - 20, taille - 20) p.setBrush(QtCore.Qt.yellow) p.drawEllipse(20, 20, taille - 40, taille - 40) p.save() p.translate(taille / 2, taille / 2) p.rotate(135 + (self.valeur * 270 / 100)) pen = QPen(QtCore.Qt.black, 10) p.setPen(pen) p.drawLine(0, 0, (taille - 40) / 3, 0) p.restore() pen = QPen(QtCore.Qt.black, 5) p.setPen(pen) p.setBrush(QtCore.Qt.red) p.drawEllipse((taille / 2) - 20, (taille / 2) - 20, 40, 40)
def drawBg(self, painter: QPainter = None) -> None: painter.save() if not self.__bgPix.isNull(): painter.drawPixmap(0, 0, self.__bgPix) painter.restore()
def drawSign(self, painter: QPainter) -> None: painter.save() # 如果当前选中则绘制角标 if self.__checked: # 计算角标区域 rec: QRect = QRect(self.width() - self.__signSize, self.height() - self.__signSize, self.__signSize, self.__signSize) # 绘制带边框背景 pen: QPen = QPen() pen.setWidth(3) pen.setColor("#FFFFFF") painter.setPen(pen) painter.setBrush(QColor(self.__signColor)) painter.drawEllipse(rec.x() + 3, rec.y() + 3, self.__signSize - 6, self.__signSize - 6) # 绘制文字 self.__iconFont.setPixelSize(16) painter.setFont(self.__iconFont) painter.drawText(rec, Qt.AlignCenter, chr(0xf00c)) painter.restore()
def paint( self, painter: QPainter, rect: QRect, mode: QIcon.Mode, state: QIcon.State ): """override""" font = FIconEngine.font if hasattr(FIconEngine, "font") else painter.font() # The following test is to avoid crash when running python widget outside the __main__.my if not font: font = painter.font() return painter.save() if self.color: painter.setPen(QPen(self.color)) else: if mode == QIcon.Disabled: painter.setPen( QPen(self.palette.color(QPalette.Disabled, QPalette.ButtonText)) ) else: painter.setPen(QPen(self.palette.color(QPalette.Active, QPalette.Text))) font.setPixelSize(rect.size().width()) painter.setFont(font) # painter.setRenderHint(QPainter.HighQualityAntialiasing, True) painter.drawText( rect, Qt.AlignCenter | Qt.AlignVCenter, str(chr(self.hex_character)) ) painter.restore()
def drawPointerIndicatorR(self, painter: QPainter) -> None: if not self.__showPointer: return radius: int = self.__radiusCircle - 15 painter.save() pen: QPen = QPen() pen.setWidth(1) pen.setColor(self.__progressColor) painter.setPen(pen) painter.setBrush(self.__progressColor) pts: QPolygon = QPolygon() pts.append(QPoint(-8, 0)) pts.append(QPoint(8, 0)) pts.append(QPoint(0, radius)) painter.rotate(self.__startAngle) degRotate: float = (360.0 - self.__startAngle - self.__endAngle) / ( self.__maxValue - self.__minValue) * (self.__value - self.__minValue) painter.rotate(degRotate) painter.drawConvexPolygon(pts) # 增加绘制圆角直线,与之前三角形重叠,形成圆角指针 pen.setCapStyle(Qt.RoundCap) pen.setWidthF(4) painter.setPen(pen) painter.drawLine(0, 0, 0, radius) # 绘制中心圆点 radius = radius // 4 painter.drawEllipse(-radius, -radius, radius * 2, radius * 2) painter.restore()
def paintEvent(self, event): painter = QPainter(self) painter.save() path = QPainterPath() painter.setFont(self.font) painter.setRenderHint(QPainter.Antialiasing) pen = QPen(QColor(0, 0, 0, 230)) pen_width = 3 pen.setWidth(pen_width) len = self.metrics.width(self.txt) w = self.width() px = (len - w) / 2 if px < 0: px = -px py = (self.height() - self.metrics.height()) / 2 + self.metrics.ascent() if py < 0: py = -py path.addText(px + 2, py + 2, self.font, self.txt) painter.strokePath(path, pen) painter.drawPath(path) painter.fillPath(path, QBrush(self.color)) painter.restore()
def drawCoverCircle(self, painter: QPainter) -> None: radius: int = self.__radiusCoverCircle painter.save() painter.setPen(Qt.NoPen) painter.setBrush(self.__bgColor) painter.drawEllipse(-radius, -radius, radius * 2, radius * 2) painter.restore()
def drawPointerIndicator(self, painter: QPainter) -> None: if not self.__showPointer: return radius: int = self.__radiusCircle - 15 painter.save() painter.setPen(Qt.NoPen) painter.setBrush(self.__progressColor) pts: QPolygon = QPolygon() pts.append(QPoint(-8, 0)) pts.append(QPoint(8, 0)) pts.append(QPoint(0, radius)) painter.rotate(self.__startAngle) degRotate: float = (360.0 - self.__startAngle - self.__endAngle) / ( self.__maxValue - self.__minValue) * (self.__value - self.__minValue) painter.rotate(degRotate) painter.drawConvexPolygon(pts) # 绘制中心圆点 radius = radius // 4 painter.drawEllipse(-radius, -radius, radius * 2, radius * 2) painter.restore()
def drawText(self, painter: QPainter, index: int, offset: int) -> None: painter.save() width: int = self.width() height: int = self.height() strValue: str = str(self.__listValue[index]) target: int = width if self.__horizontal else height font: QFont = painter.font() font.setPixelSize((target - abs(offset)) // 8) painter.setFont(font) if self.__horizontal: textWidth: int = painter.fontMetrics().width(strValue) initX: int = width // 2 + offset - textWidth // 2 painter.drawText(QRect(initX, 0, textWidth, height), Qt.AlignCenter, strValue) # 计算最后中间值停留的起始坐标,以便鼠标松开时矫正居中 if index is self.__currentIndex: self.__currentPos = initX else: textHeight: int = painter.fontMetrics().height() initY: int = height // 2 + offset - textHeight // 2 painter.drawText(QRect(0, initY, width, textHeight), Qt.AlignCenter, strValue) # 计算最后中间值停留的起始坐标,以便鼠标松开时矫正居中 if index is self.__currentIndex: self.__currentPos = initY painter.restore()
def drawLine(self, painter: QPainter) -> None: """ """ if not self.__showLine: return if not self.isChecked(): return painter.save() pen: QPen = QPen() pen.setWidth(self.__lineWidth) pen.setColor(self.__lineColor) painter.setPen(pen) # 根据线条位置设置线条坐标 pointStart: QPoint = QPoint() pointEnd: QPoint = QPoint() if self.__linePosition == NavButton.LinePosition.LINEPOSITION_LEFT: pointStart = QPoint(0, 0) pointEnd = QPoint(0, self.height()) elif self.__linePosition == NavButton.LinePosition.LINEPOSITION_RIGHT: pointStart = QPoint(self.width(), 0) pointEnd = QPoint(self.width(), self.height()) elif self.__linePosition == NavButton.LinePosition.LINEPOSITION_TOP: pointStart = QPoint(0, 0) pointEnd = QPoint(self.width(), 0) elif self.__linePosition == NavButton.LinePosition.LINEPOSITION_BOTTOM: pointStart = QPoint(0, self.height()) pointEnd = QPoint(self.width(), self.height()) painter.drawLine(pointStart, pointEnd) painter.restore()
def drawText_TB(self, painter: QPainter) -> None: width: int = self.width() // self.__maxStep height: int = self.height() // 3 initX: int = 0 initY: int = 0 painter.save() font: QFont = QFont() font.setPixelSize(height // 3) painter.setFont(font) painter.setPen(self.__background) painter.setBrush(Qt.NoBrush) # 绘制上部分文字 for i in range(self.__maxStep): textRect: QRect = QRect(initX, initY, width, height) painter.drawText(textRect, Qt.AlignCenter, self.__topInfo[i]) initX += width # 绘制下部分文字 initX = 0 initY: int = self.height() // 3 * 2 for i in range(self.__currentStep): textRect: QRect = QRect(initX, initY, width, height) painter.drawText(textRect, Qt.AlignCenter, self.__bottomInfo[i]) initX += width painter.restore()
def _draw_item_background(self, p: QPainter): """ 绘制项目的背景 :param p: 画刷 :return: None """ if self._m_start_rect.isNull(): return p.save() lgt = QLinearGradient(self._m_start_rect.topLeft(), self._m_start_rect.bottomRight()) lgt.setColorAt(0.0, self._m_item_start_color) lgt.setColorAt(1.0, self._m_item_end_color) p.setPen(Qt.NoPen) p.setBrush(lgt) p.drawRoundedRect(self._m_start_rect, self._m_item_radius, self._m_item_radius) # 绘制 hover 状态下的item if self._m_current_hover_index != -1: hover_rect = QRectF(self._m_item_maps[self._m_current_hover_index][1]) lgt = QLinearGradient(hover_rect.topLeft(), hover_rect.bottomRight()) lgt.setColorAt(0.0, self._m_item_hover_start_color) lgt.setColorAt(1.0, self._m_item_hover_end_color) p.setPen(Qt.NoPen) p.setBrush(lgt) p.drawRoundedRect(hover_rect, self._m_item_radius, self._m_item_radius) p.restore()
def paintEvent(self, event:QPaintEvent): p = QPainter(self) p.setBrush(Qt.blue) p.drawRect(10,10,self.width()-20, self.height()-20) p.setBrush(Qt.yellow) p.drawEllipse(20,20,self.width()-40, self.height()-40) p.save() p.translate(self.width()/2,self.height()/2) p.save() p.rotate((-90 + self.heure*30)+(self.minute)/2) pen = QPen(Qt.green,10) p.setPen(pen) p.drawLine(0,0,(self.width()-40)/5,0) p.restore() p.rotate(-90 + self.minute*6) pen = QPen(Qt.black, 10) p.setPen(pen) p.drawLine(0, 0, (self.width() - 40) / 3, 0) p.restore() p.setBrush(Qt.red) p.drawEllipse((self.width()/2)-20,(self.height()/2)-20,40, 40)
def paintEvent(self, event): rect = QRect(10, 20, 80, 60) path = QPainterPath() path.moveTo(20, 80) path.lineTo(20, 30) path.cubicTo(80, 0, 50, 50, 80, 80) startAngle = 30 * 16 arcLength = 120 * 16 painter = QPainter(self) painter.setPen(self.pen) painter.setBrush(self.brush) if self.antialiased: painter.setRenderHint(QPainter.Antialiasing) for x in range(0, self.width(), 100): for y in range(0, self.height(), 100): painter.save() painter.translate(x, y) if self.transformed: painter.translate(50, 50) painter.rotate(60.0) painter.scale(0.6, 0.9) painter.translate(-50, -50) if self.shape == RenderArea.Line: painter.drawLine(rect.bottomLeft(), rect.topRight()) elif self.shape == RenderArea.Points: painter.drawPoints(RenderArea.points) elif self.shape == RenderArea.Polyline: painter.drawPolyline(RenderArea.points) elif self.shape == RenderArea.Polygon: painter.drawPolygon(RenderArea.points) elif self.shape == RenderArea.Rect: painter.drawRect(rect) elif self.shape == RenderArea.RoundedRect: painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize) elif self.shape == RenderArea.Ellipse: painter.drawEllipse(rect) elif self.shape == RenderArea.Arc: painter.drawArc(rect, startAngle, arcLength) elif self.shape == RenderArea.Chord: painter.drawChord(rect, startAngle, arcLength) elif self.shape == RenderArea.Pie: painter.drawPie(rect, startAngle, arcLength) elif self.shape == RenderArea.Path: painter.drawPath(path) elif self.shape == RenderArea.Text: painter.drawText(rect, Qt.AlignCenter, "PySide 2\nQt %s" % qVersion()) elif self.shape == RenderArea.Pixmap: painter.drawPixmap(10, 10, self.pixmap) painter.restore() painter.setPen(self.palette().dark().color()) painter.setBrush(Qt.NoBrush) painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
def drawBg(self, painter: QPainter) -> None: painter.save() # 如果悬停则绘制外边框和内边框 if self.__hover or self.__hovered: painter.setBrush(Qt.NoBrush) pen: QPen = QPen() pen.setWidth(2) # 绘制外边框 pen.setColor(self.__bgColor) painter.setPen(pen) painter.drawRect(5, 5, self.width() - 10, self.height() - 10) # 绘制里边框 pen.setColor("#FFFFFF") painter.setPen(pen) painter.drawRect(7, 7, self.width() - 14, self.height() - 14) # 绘制里边背景 painter.setPen(Qt.NoPen) painter.setBrush(QColor(self.__bgColor)) painter.drawRect(8, 8, self.width() - 16, self.height() - 16) painter.restore()
def paintEvent(self, event): side = min(self.width(), self.height()) time = QTime.currentTime() painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.translate(self.width() / 2, self.height() / 2) painter.scale(side / 200.0, side / 200.0) painter.setPen(Qt.NoPen) painter.setBrush(AnalogClock.hourColor) painter.save() painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))) painter.drawConvexPolygon(AnalogClock.hourHand) painter.restore() painter.setPen(AnalogClock.hourColor) for i in range(12): painter.drawLine(88, 0, 96, 0) painter.rotate(30.0) painter.setPen(Qt.NoPen) painter.setBrush(AnalogClock.minuteColor) painter.save() painter.rotate(6.0 * (time.minute() + time.second() / 60.0)) painter.drawConvexPolygon(AnalogClock.minuteHand) painter.restore() painter.setPen(AnalogClock.minuteColor) for j in range(60): if (j % 5) != 0: painter.drawLine(92, 0, 96, 0) painter.rotate(6.0)
def _draw_objects(self, painter: QPainter, level: Level): for level_object in level.get_all_objects(): level_object.render() if level_object.description.lower() in SPECIAL_BACKGROUND_OBJECTS: width = LEVEL_MAX_LENGTH height = GROUND - level_object.y_position blocks_to_draw = [level_object.blocks[0]] * width * height for index, block_index in enumerate(blocks_to_draw): x = level_object.x_position + index % width y = level_object.y_position + index // width level_object._draw_block(painter, block_index, x, y, self.block_length, False) else: level_object.draw(painter, self.block_length, self.transparency) if level_object.selected: painter.save() painter.setPen(QPen(QColor(0x00, 0x00, 0x00, 0x80), width=1)) painter.drawRect(level_object.get_rect(self.block_length)) painter.restore()
def drawBg_ZFB(self, painter: QPainter) -> None: painter.save() # 圆半径为高度一定比例,计算宽度,将宽度等分 width: int = self.width() // self.__maxStep height: int = self.height() // 3 radius: int = height // 3 initX: int = width // 2 initY: int = self.height() // 2 # 逐个绘制连接线条 pen: QPen = QPen() pen.setWidthF(radius // 4) pen.setCapStyle(Qt.RoundCap) pen.setColor(self.__background) painter.setPen(pen) painter.setBrush(Qt.NoBrush) for i in range(self.__maxStep - 1): painter.drawLine(QPoint(initX, initY), QPoint(initX + width, initY)) initX += width # 逐个绘制圆 initX: int = width // 2 painter.setPen(Qt.NoPen) painter.setBrush(self.__background) for i in range(self.__maxStep): painter.drawEllipse(QPoint(initX, initY), radius, radius) initX += width painter.restore()
def drawBg(self, painter: QPainter) -> None: painter.save() width: int = self.width() height: int = self.height() side: int = min(width, height) pen: QPen = QPen() pen.setWidth(self.__borderWidth) pen.setColor(self.__borderColor) painter.setPen(pen if self.__borderWidth > 0 else Qt.NoPen) painter.setBrush(self.bgColor) rect: QRect = QRect( ((width - self.__tempWidth) // 2) + self.__borderWidth, self.__borderWidth, self.__tempWidth - (self.__borderWidth * 2), height - (self.__borderWidth * 2)) painter.drawRoundedRect(rect, self.__borderRadius, self.__borderRadius) font: QFont = QFont() font.setPixelSize(side - 18) painter.setFont(font) painter.setPen(self.__lineColor) painter.drawText(rect, Qt.AlignCenter, "完成" if self.__status == 2 else "开始") painter.restore()
def drawBg(self, painter: QPainter) -> None: radius: int = 99 painter.save() painter.setPen(Qt.NoPen) painter.setBrush(self.__bgColor) painter.drawEllipse(-radius, -radius, radius * 2, radius * 2) painter.restore()
def drawLine(self, painter: QPainter) -> None: # 上下部分偏移量 offset: int = 10 width: int = self.width() height: int = self.height() painter.save() painter.setBrush(Qt.NoBrush) pen: QPen = QPen() pen.setWidth(3) pen.setColor(self.__lineColor) pen.setCapStyle(Qt.RoundCap) painter.setPen(pen) # 每次同时存在三个元素 if self.__horizontal: painter.drawLine(width // 3 * 1, offset, width // 3 * 1, height - offset) painter.drawLine(width // 3 * 2, offset, width // 3 * 2, height - offset) else: painter.drawLine(offset, height // 3 * 1, width - offset, height // 3 * 1) painter.drawLine(offset, height // 3 * 2, width - offset, height // 3 * 2) painter.restore()
def drawColorPie(self, painter: QPainter) -> None: radius: int = 95 painter.save() painter.setPen(Qt.NoPen) rect: QRectF = QRectF(-radius, -radius, radius * 2, radius * 2) # 计算总范围角度,当前值范围角度,剩余值范围角度 angleAll: float = 360.0 - self.__startAngle - self.__endAngle angleCurrent: float = angleAll * ((self.__value - self.__minValue) / (self.__maxValue - self.__minValue)) angleOther: float = angleAll - angleCurrent # 绘制当前值饼圆 painter.setBrush(self.__progressColor) painter.drawPie(rect, (270 - self.__startAngle - angleCurrent) * 16, angleCurrent * 16) # 绘制剩余值饼圆 painter.setBrush(self.__progressBgColor) painter.drawPie( rect, (270 - self.__startAngle - angleCurrent - angleOther) * 16, angleOther * 16) painter.restore()
def _draw_background(self, painter: QPainter, level: Level): painter.save() bg_color = bg_color_for_object_set(level.object_set_number, level.header.object_palette_index) painter.fillRect(level.get_rect(self.block_length), bg_color) painter.restore()
def paintEvent(self, event): painter = QPainter(self) painter.fillRect(self.rect(), Qt.black) if self.pixmap.isNull(): painter.setPen(Qt.white) painter.drawText(self.rect(), Qt.AlignCenter, "Rendering initial image, please wait...") return if self.curScale == self.pixmapScale: painter.drawPixmap(self.pixmapOffset, self.pixmap) else: scaleFactor = self.pixmapScale / self.curScale newWidth = int(self.pixmap.width() * scaleFactor) newHeight = int(self.pixmap.height() * scaleFactor) newX = self.pixmapOffset.x() + (self.pixmap.width() - newWidth) / 2 newY = self.pixmapOffset.y() + (self.pixmap.height() - newHeight) / 2 painter.save() painter.translate(newX, newY) painter.scale(scaleFactor, scaleFactor) exposed, _ = painter.matrix().inverted() exposed = exposed.mapRect(self.rect()).adjusted(-1, -1, 1, 1) painter.drawPixmap(exposed, self.pixmap, exposed) painter.restore() text = "Use mouse wheel or the '+' and '-' keys to zoom. Press and " \ "hold left mouse button to scroll." metrics = painter.fontMetrics() textWidth = metrics.width(text) painter.setPen(Qt.NoPen) painter.setBrush(QColor(0, 0, 0, 127)) painter.drawRect((self.width() - textWidth) / 2 - 5, 0, textWidth + 10, metrics.lineSpacing() + 5) painter.setPen(Qt.white) painter.drawText((self.width() - textWidth) / 2, metrics.leading() + metrics.ascent(), text)