def drawInfo(self, x, y, name1, name2=None, textColor=QColor(Qt.white), color2=QColor(Qt.white)): textColor.setAlpha(200) painter = QPainter() painter.begin(self) painter.setPen(QPen(textColor)) font = painter.font() font.setPointSize(font.pointSize()) painter.setFont(font) painter.drawText(x, y, name1) painter.end() if name2 is not None: painter.begin(self) color2.setAlpha(200) painter.setPen(QPen(color2)) font = painter.font() font.setPointSize(font.pointSize()) painter.setFont(font) painter.drawText(x + 30, y, name2) painter.end()
def drawVal(self, painter: QtGui.QPainter): count = self.prim da = (self.finishA - self.startA) / count dv = (self.finishV - self.startV) / count w = QtGui.QFontMetrics(painter.font()).width( self.f_str.format(self.finishV)) for i in range(count + 1): v = self.startV + i * dv w = max( w, QtGui.QFontMetrics(painter.font()).width(self.f_str.format(v))) h = QtGui.QFontMetrics(painter.font()).height() for i in range(count + 1): painter.save() painter.translate(self.x, self.y) a = -self.startA - da * i painter.rotate(a) v = self.startV + i * dv l = self.r + self.linewidth + h + 4 + w / 2 painter.translate(l, 0) painter.rotate(-a) painter.drawText(-w / 2, -h / 2, w, h, QtCore.Qt.AlignCenter, self.f_str.format(v)) painter.restore()
def paintEvent(self, event): painter = QPainter(self) if self.pixmap: painter.drawPixmap(0, 0, self.pixmap) rect = QRect(0, 0, self.width(), self.height()) margin = 25 pad = 10 if self.distance: txt = QLocale().toString(self.distance / 1000, 'f', 1) + ' km' fm = QFontMetrics(painter.font()) rect = fm.boundingRect(txt) rect = fm.boundingRect(rect, 0, txt) rect.adjust(-pad, 0, pad, 0) rect.moveBottomRight( QPoint(self.width() - margin, self.height() - margin)) if self.intersectsMarkers(rect): rect.moveTopRight(QPoint(self.width() - margin, margin)) painter.fillRect(rect, QColor(255, 255, 255, 192)) painter.drawText(rect, Qt.AlignCenter, txt) if self.duration: minutes = math.floor(self.duration / 60) seconds = self.duration - minutes * 60 txt = '%u:%02u min.' % (minutes, seconds) fm = QFontMetrics(painter.font()) rect = fm.boundingRect(txt) rect = fm.boundingRect(rect, 0, txt) rect.adjust(-pad, 0, pad, 0) rect.moveBottomLeft(QPoint(margin, self.height() - margin)) if self.intersectsMarkers(rect): rect.moveTopLeft(QPoint(margin, margin)) painter.fillRect(rect, QColor(255, 255, 255, 192)) painter.drawText(rect, Qt.AlignCenter, txt)
def set_w_h(self, form): painter = QPainter() painter.begin(form) font = painter.font() font.setPixelSize(self.font_size) painter.setFont(font) fm = QFontMetrics(painter.font()) self.width = fm.width(self.text) self.height = fm.height() painter.end()
def paintEvent(self, event): print('hujFrame PaintEvent()', event.rect()) painter = QPainter() rect = painter.viewport() print('hujFrame painter.viewport()', event.rect()) painter.begin(self) painter.save() font = painter.font() font.setPixelSize(56) painter.setFont(font) # painter.translate(100, 100) rectangle = QRect(160, 160, 100, 50) boundingRect = painter.drawText(rectangle, 0, self.tr("Hello")) pen = painter.pen() pen.setStyle(Qt.DotLine) painter.setPen(pen) painter.drawRect( boundingRect.adjusted(0, 0, -pen.width(), -pen.width())) pen.setStyle(Qt.DashLine) painter.setPen(pen) painter.drawRect(rectangle.adjusted(0, 0, -pen.width(), -pen.width())) painter.restore() painter.end() del painter super(hujFrame, self).paintEvent(event)
def paintEvent(self, event): painter = QPainter() painter.begin(self) if self.pos_x0 == -20: pass else: pen = QPen(Qt.white, 2, Qt.SolidLine) painter.setPen(pen) painter.drawLine(self.pos_x0, self.pos_y0, self.pos_x, self.pos_y) dy = self.pos_y - self.pos_y0 dx = self.pos_x - self.pos_x0 if dx == 0: theta = 0.5 * pi else: theta = arctan(dy / dx) theta *= 180 / pi length = int(sqrt(dx**2 + dy**2) * 10) / 10 font = painter.font() font.setPointSize(18) painter.setFont(font) painter.drawText( self.pos_x, self.pos_y, str(int(abs(theta) * 100) / 100) + " deg, " + str(length) + " px") painter.end()
def paint(self): try: pixmap_bg = QPixmap(self.size()) pixmap_bg.fill(QColor(50, 50, 250)) painter = QPainter() painter.begin(pixmap_bg) if not self.app.reconstruction is None: photo = self.app.reconstruction.macro_photo size_draw = QSize(min(self.width(), photo.size().width()), min(self.height(), photo.size().height())) painter.setPen(Qt.red) font = painter.font() font.setPixelSize(48) painter.setFont(font) target = QRect(QPoint(0, 0), size_draw) source = QRect( self.position, QPoint(size_draw.width(), size_draw.height()) + self.position) painter.drawPixmap(target, photo, source) for slice in self.app.reconstruction.slices: painter.drawRect(slice.rect.x() - self.position.x(), slice.rect.y() - self.position.y(), slice.rect.width(), slice.rect.height()) coords = slice.rect.getCoords() painter.drawText( QPoint(coords[0], coords[3]) - self.position, str(slice.id)) if len(self.app.reconstruction.ruler_points) > 0: painter.drawEllipse( self.app.reconstruction.ruler_points[0] - self.position, 10, 10) if len(self.app.reconstruction.ruler_points) > 1: p0 = self.app.reconstruction.ruler_points[0] p1 = self.app.reconstruction.ruler_points[1] painter.drawEllipse(p1 - self.position, 10, 10) painter.drawLine( p0 - self.position, p1 - self.position, ) painter.drawLine(p0 - self.position, p1 - self.position) p0_np = np.array(p0) p1_np = np.array(p1) # for i in range(13): painter.end() self.setPixmap(pixmap_bg) except: self.logger.error(sys.exc_info()[0]) self.logger.error(traceback.format_exc()) pass
def getFileIcon(self): # _text = Path(self.alt).name _suffix = Path(self.alt).suffix.upper() _suffix = _suffix[1:] if _suffix else "(Unknown)" _pixmap = QPixmap(120, 120) _pixmap.fill(QColor(0, 0, 0, 0)) _painter = QPainter(_pixmap) _painter.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing) # draw rounded rect _pen = _painter.pen() _pen.setWidth(2) _painter.setPen(_pen) _painter.drawRoundedRect(QRect(1, 1, 118, 118), 15, 15) # draw suffix text _rect = QRect(8, 10, 108, 35) #100*25 _painter.setPen(QPen(QColor("#0f59a4"))) _painter.setFont(CFG.FONT_ICON_SUFFIX('MFHistoryItem')) _painter.drawText(_rect, Qt.AlignHCenter | Qt.TextSingleLine, _suffix) _painter.setPen(_pen) # draw splitter _painter.drawLine(1, 40, 118, 40) # draw suffix text _rect = QRect(8, 45, 108, 110) #100*65 _painter.setFont(CFG.FONT_ICON_NAME('MFHistoryItem')) _fm = QFontMetrics(_painter.font()) # _elided_text = _fm.elidedText(_text, Qt.ElideMiddle, _rect.width(), Qt.TextWrapAnywhere) _painter.drawText(_rect, Qt.AlignHCenter | Qt.TextWrapAnywhere, _text) del _painter return _pixmap
def __draw_position(self, painter: QPainter): text = str(self.domain.start) lx = self.rect.left() - QFontMetrics(painter.font()).width(text) / 2 painter.setPen(DRAWING.POSITION_TEXT) painter.drawText(QPointF(lx, self.rect.top() - DRAWING.TEXT_MARGIN), text)
def __init__(self, pixmap, text, size=0.5, corner=BottomRight): super().__init__() base_pixmap = QPixmap(pixmap) base_size = base_pixmap.size() base_max = min(base_size.height(), base_size.width()) if not base_max: # Because gridsync.gui.systray.animation.currentPixmap() returns # a blank pixmap when unpausing the animation for the first time. # Returning early to prevents QPainter from spewing warnings. self.swap(base_pixmap) return badge_max = base_max * size pen_width = badge_max * 0.05 rect = QRect(base_max * max(corner[0] - size, 0) + pen_width, base_max * max(corner[1] - size, 0) + pen_width, badge_max - pen_width, badge_max - pen_width) painter = QPainter(base_pixmap) painter.setRenderHint(QPainter.Antialiasing) painter.setPen(QPen(Qt.red, pen_width)) painter.setBrush(QBrush(Qt.red)) painter.drawEllipse(rect) if text: font = painter.font() font.setPixelSize(badge_max - pen_width) painter.setFont(font) painter.setPen(Qt.white) painter.drawText(rect, Qt.AlignCenter, str(text)) painter.end() self.swap(base_pixmap)
def printDocument(self, printer): loop = QEventLoop() result = False def printPreview(success): nonlocal result result = success loop.quit() progressbar = QProgressDialog(self.m_page.view()) progressbar.findChild(QProgressBar).setTextVisible(False) progressbar.setLabelText("Wait please...") progressbar.setRange(0, 0) progressbar.show() progressbar.canceled.connect(loop.quit) self.m_page.print(printer, printPreview) loop.exec_() progressbar.close() if not result: painter = QPainter() if painter.begin(printer): font = painter.font() font.setPixelSize(20) painter.setFont(font) painter.drawText(QPointF(10, 25), "Could not generate print preview.") painter.end()
def paintEvent(self, e): qp = QPainter() qp.begin(self) font = QFont(qp.font()) font.setPixelSize(self.width() * 1.0) qp.setFont(font) #pen = QPen(Qt.black) #pen.setWidth(10) #qp.setPen(pen) fr = self.frameRect() b = self.lineWidth() fr.adjust(b, b, -b, -b) #qp.fillRect(fr, QColor(255, 255, 255)) if self.number is None: number = "-" else: number = str(self.number) qp.drawText(fr, Qt.AlignCenter, number) qp.end() super().paintEvent(e)
def draw_indicator(indicator: int): pixmap = QPixmap(24, 24) painter = QPainter(pixmap) w, h = pixmap.width(), pixmap.height() painter.fillRect(0, 0, w, h, QBrush((QColor(0, 0, 200, 255)))) pen = QPen(QColor("white")) pen.setWidth(2) painter.setPen(pen) font = util.get_monospace_font() font.setBold(True) font.setPixelSize(16) painter.setFont(font) f = QFontMetrics(painter.font()) indicator_str = str(indicator) if indicator < 10 else "+" fw = f.width(indicator_str) fh = f.height() painter.drawText(math.ceil(w / 2 - fw / 2), math.ceil(h / 2 + fh / 4), indicator_str) painter.end() return QIcon(pixmap)
def paintEvent(self, event): content_rect = self.contentsRect() if self.spinner_size: size = min(self.spinner_size, content_rect.width(), content_rect.height()) else: size = min(content_rect.width(), content_rect.height()) dot_count = 5 dot_size = int(size / dot_count) * 1.5 spinner_rect = QRect(content_rect.left(), content_rect.top(), size, size) painter = QPainter(self) painter.setClipRect(content_rect) if self.timer_id: diff_height = content_rect.height() - size offs_y = 0 if diff_height > 0: if self.vertical_align == Qt.AlignVCenter: offs_y = diff_height / 2 elif self.vertical_align == Qt.AlignBottom: offs_y = diff_height x_center = spinner_rect.left( ) + spinner_rect.width() / 2 - dot_size / 2 y_center = spinner_rect.top( ) + offs_y + spinner_rect.height() / 2 - dot_size / 2 painter.save() for i in range(dot_count): if self.counter % dot_count == i: painter.setBrush(QBrush(QColor(0, 0, 0))) d_size = dot_size * 1.1 else: painter.setBrush(QBrush(QColor(200, 200, 200))) d_size = dot_size r = size / 2 - dot_size / 2 x = r * math.cos(2 * math.pi * i / dot_count) y = r * math.sin(2 * math.pi * i / dot_count) painter.drawEllipse(x_center + x, y_center + y, d_size, d_size) painter.restore() if self.message: # painter.setPen(QPen(Qt.black)) if self.font_size: f = painter.font() f.setPointSize(self.font_size) painter.setFont(f) text_rect = QRect(content_rect) text_rect.translate( spinner_rect.width() + SpinnerWidget.SPINNER_TO_TEXT_DISTANCE if self.timer_id else 0, 0) painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, self.message) painter.end()
def paintEvent(self, event): painter = QPainter(self) x = 10 y = 10 font = painter.font() font.setPixelSize(13) painter.setFont(font) for i in range(settings.w + 1): painter.drawLine(x, 10, x, settings.h * settings.size + 10) x += settings.size for i in range(settings.h + 1): painter.drawLine(10, y, settings.w * settings.size + 10, y) y += settings.size s = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20' ] x = settings.size / 2 + 5 for symbol in s: painter.drawText(x, 10, symbol) x += settings.size d = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T' ] y = settings.size / 2 + 12 for symbol in d: painter.drawText(0, y, symbol) y += settings.size
def paintEvent(self, event): label = self.text_true if self.isChecked() else self.text_false bg_color = Qt.darkGreen if self.isChecked() else Qt.red radius = 10 width = 32 center = self.rect().center() painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.translate(center) painter.setBrush(QColor(0, 0, 0)) pen = QPen(Qt.black) pen.setWidth(2) painter.setPen(pen) painter.drawRoundedRect(QRect(-width, -radius, 2 * width, 2 * radius), radius, radius) painter.setBrush(QBrush(bg_color)) sw_rect = QRect(-radius, -radius, width + radius, 2 * radius) if not self.isChecked(): sw_rect.moveLeft(-width) painter.drawRoundedRect(sw_rect, radius, radius) painter.setPen(QPen(self.text_color)) font = painter.font() font.setPixelSize(math.ceil(1.8 * radius)) painter.setFont(font) painter.drawText(sw_rect, Qt.AlignCenter, label)
def makeSplash(): """ This makes a splash screen that has the current FOQUS version information as well as all of the third party dependency information """ # Load the splash screen background svg, gonna draw text over pixmap = QPixmap(':/icons/icons/ccsiSplash2.svg') # Make a painter to add text to painter = QPainter(pixmap) font = painter.font() # current font for drawing text font.setPointSize(8) font.setBold(True) painter.setFont(font) painter.drawText(20, 110, "Version: {}".format(ver.version)) font.setBold(False) painter.setFont(font) painter.drawText( 20, 200, 740, 50, QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft | QtCore.Qt.TextWordWrap, "License: {}".format(ver.license)) painter.drawText( 20, 250, 740, 50, QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft | QtCore.Qt.TextWordWrap, "Support: {}".format(ver.support)) painter.drawText( 20, 300, 740, 300, QtCore.Qt.AlignTop | QtCore.Qt.AlignLeft | QtCore.Qt.TextWordWrap, ver.copyright) painter.end() splashScr[1] = QSplashScreen(pixmap=pixmap)
def lineNumberAreaPaintEvent( self, event): # When text zoomed line number not zoomed """Painting line number area""" painter = QPainter(self.lineNumberArea) painter.fillRect(event.rect(), Qt.lightGray) block = self.firstVisibleBlock() blockNumber = block.blockNumber() top = int( self.blockBoundingGeometry(block).translated( self.contentOffset()).top()) bottom = top + int(self.blockBoundingRect(block).height()) # font_height = self.fontMetrics().height() while block.isValid() and top <= event.rect().bottom(): if block.isVisible() and bottom >= event.rect().top(): font_original = self.document().defaultFont() size = font_original.pointSize() font = painter.font() font.setPointSize(size) painter.setFont(font) number = str(blockNumber + 1) painter.setPen(Qt.black) painter.drawText(0, top, self.lineNumberArea.width(), self.fontMetrics().height(), Qt.AlignRight, number) block = block.next() top = bottom bottom = top + int(self.blockBoundingRect(block).height()) blockNumber += 1
def paintGame(painter: QPainter): global board painter.fillRect(0, 0, 700, 700, Qt.white) # ERSCHAFFT FREIEN PLATZ OBEN painter.fillRect(0, 100, 700, 600, Qt.blue) # FUELLT RECHTECK AUS pen = painter.pen() # STIFT WIRD ERZEUGT pen.setWidth(3) painter.setPen(pen) # PEN WIRD ANGESETZ # We offset the rows by one to leave space to "throw the chips" for y in range(2, rows): y1 = y * 100 x1 = 0 x2 = 700 painter.drawLine(x1, y1, x2, y1) # HORIZONTALE LINIEN for x in range(1, cols): y1 = 100 y2 = 700 x1 = x * 100 painter.drawLine(x1, y1, x1, y2) # VERTIKALE LINIEN font = painter.font() font.setPixelSize(80) # PIXELGROESSE VON FONT painter.setFont(font) for y in range(rows): # BERECHNET STELLE IM FELD AUF X EBENE for x in range(cols): # BERECHNET STELLE IM FELD AUF Y EBENE if board[x][y] != '_': painter.drawText(x * 100, y * 100, 100, 100, Qt.AlignCenter, board[x][y])
def paintEvent(self, event): painter = QPainter(self) font = painter.font() font.setPointSize(self.width() / 6.0) painter.setFont(font) painter.drawText(self.rect(), Qt.AlignCenter | Qt.AlignVCenter, str(self.value())) QDial.paintEvent(self, event)
def paintEvent(self, event=None): side = min(self.width(), self.height()) pos = self.value ref_pos = self.refValue painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.translate(self.width() / 2 + 10, self.height() / 2) painter.scale(side / 230.0, side / 230.0) painter.setBrush(Qt.NoBrush) painter.setPen(QColor(0, 0, 0)) painter.drawRect(-100, -100, 2 * 100, 2 * 100) for i in range(20): x = -100 + i * 10 painter.drawLine(x, 100, x, 98) painter.drawLine(x, -100, x, -98) painter.drawLine(-100, x, -98, x) painter.drawLine(100, x, 98, x) painter.drawLine(-100, 0, 100, 0) painter.drawLine(-100, 50, 100, 50) painter.drawLine(-100, -50, 100, -50) painter.drawLine(-50, -100, -50, 100) painter.drawLine(50, 100, 50, -100) painter.drawLine(0, -100, 0, 100) painter.setBrush(self.ref_color) painter.setPen(self.ref_color) painter.drawEllipse( (ref_pos[0] * (100 / self.range_x)) - self.pointWidth, (ref_pos[1] * -(100 / self.range_y)) - self.pointWidth, 2.1 * self.pointWidth, 2.1 * self.pointWidth) painter.setBrush(self.color) painter.drawEllipse((pos[0] * (100 / self.range_x)) - self.pointWidth, (pos[1] * -(100 / self.range_y)) - self.pointWidth, 2 * self.pointWidth, 2 * self.pointWidth) # painter.save() # painter.setPen(QColor(0,0,0)) # painter.rotate(180) # for i in range(2): # painter.drawLine(-1*((pos[0] * (100/self.scale)) - self.pointWidth/2), -1*((pos[1] * -(100/self.scale)) - self.pointWidth/2), # -1*((pos[0] * (100/self.scale)) + self.pointWidth/2), -1*((pos[1] * -(100/self.scale)) + self.pointWidth/2)) # painter.rotate(180) # painter.restore() painter.setPen(QColor(0, 0, 0)) font = painter.font() font.setPointSize(font.pointSize() * 1.2) painter.setFont(font) painter.drawText(QRectF(-107, 102, 30, 20), str(self.scale_x[0])) painter.drawText(QRectF(90, 102, 30, 20), str(1 * self.scale_x[1])) painter.drawText(QRectF(-130, 90, 30, 20), str(self.scale_y[0])) painter.drawText(QRectF(-125, -105, 30, 20), str(1 * self.scale_y[1]))
def paintEvent(self, event): painter = QPainter(self) if self.pixmap: painter.drawPixmap(0, 0, self.pixmap) margin = 25 pad = 10 if self.objectPlan: txt = self.objectPlan fm = QFontMetrics(painter.font()) rect = fm.boundingRect(txt) rect = fm.boundingRect(rect, 0, txt) rect.adjust(-pad, -pad, pad, pad) imageDir = self.config.get("display", "image_dir", fallback="images") iconPath = os.path.join(imageDir, 'text-x-generic.svg') icon = QIcon(iconPath) iconSize = icon.actualSize(rect.size()) rect.adjust(0, 0, iconSize.width(), 0) rect.moveBottomLeft(QPoint(margin, self.height() - margin)) painter.fillRect(rect, QColor(220, 220, 150, 225)) iconRect = QRect(rect) iconRect.setWidth(iconSize.width()) icon.paint(painter, iconRect) textRect = rect.adjusted(iconRect.width(), 0, 0, 0) painter.drawText(textRect, Qt.AlignCenter, txt)
def paintEvent(self, event): p = QPainter(self) p.setRenderHint(QPainter.Antialiasing) r = event.rect() outer = Qt.gray if self._is_pick: inner = Qt.yellow else: inner = Qt.white p.fillRect(r, QBrush(inner)) pen = QPen(outer) pen.setWidth(1) p.setPen(pen) p.drawRect(r) if self.get_number() != 0: pen = QPen(QColor('#000000')) p.setPen(pen) f = p.font() f.setBold(True) p.setFont(f) p.drawText(r, Qt.AlignHCenter | Qt.AlignVCenter, str(self.get_number()))
def paintEvent(self, event): p = QPainter(self) if self.scrollEnabled: self.buffer.fill(qRgba(0, 0, 0, 0)) pb = QPainter(self.buffer) pb.setPen(p.pen()) pb.setFont(p.font()) x = min(-self.scrollPos, 0) + self.leftMargin while x < self.width(): pb.drawStaticText( QPointF(x, (self.height() - self.wholeTextSize.height()) / 2) + QPoint(2, 2), self.staticText) x += self.wholeTextSize.width() #Apply Alpha Channel pb.setCompositionMode(QPainter.CompositionMode_DestinationIn) pb.setClipRect(self.width() - 15, 0, 15, self.height()) pb.drawImage(0, 0, self.alphaChannel) pb.setClipRect(0, 0, 15, self.height()) #initial situation: don't apply alpha channel in the left half of the image at all; apply it more and more until scrollPos gets positive if self.scrollPos < 0: pb.setOpacity((max(-8, self.scrollPos) + 8) / 8.0) pb.drawImage(0, 0, self.alphaChannel) p.drawImage(0, 0, self.buffer) else: x = (self.width() - self.wholeTextSize.width()) / 2 y = (self.height() - self.wholeTextSize.height()) / 2 p.drawStaticText(QPointF(x, y), self.staticText)
def paintEvent(self, event): if self.isVisible(): block = self.editor.firstVisibleBlock() height = self.fontMetrics().height() number = block.blockNumber() painter = QPainter(self) painter.fillRect(event.rect(), lineBarColor) painter.drawRect(0, 0, event.rect().width() - 1, event.rect().height() - 1) font = painter.font() current_block = self.editor.textCursor().block().blockNumber() + 1 while block.isValid(): block_geometry = self.editor.blockBoundingGeometry(block) offset = self.editor.contentOffset() block_top = block_geometry.translated(offset).top() number += 1 rect = QRect(0, block_top, self.width() - 5, height) if number == current_block: font.setBold(True) else: font.setBold(False) painter.setFont(font) painter.drawText(rect, Qt.AlignRight, '%i' % number) if block_top > event.rect().bottom(): break block = block.next() painter.end()
class DigitImage(QLabel): def __init__(self, *args): super().__init__(*args) self.setFixedSize(200, 200) self.setStyleSheet('border: 3px solid grey;') @pyqtSlot(int) def drawDigit(self, digit): print(digit) self.painter = QPainter(self.pixmap()) self.painter.begin(self.pixmap()) font = self.painter.font() font.setPointSize(60) self.painter.setFont(font) self.painter.drawText(self.rect(), QtCore.Qt.AlignCenter, str(digit)) self.painter.end() self.repaint() @pyqtSlot() def clear(self): self.painter.begin(self.pixmap()) self.painter.eraseRect(self.rect()) self.painter.end() self.repaint()
def lineNumberAreaPaintEvent(self, event): # When text zoomed line number not zoomed """Painting line number area""" painter = QPainter(self.lineNumberArea) painter.fillRect(event.rect(), Qt.lightGray) block = self.firstVisibleBlock() blockNumber = block.blockNumber() top = int(self.blockBoundingGeometry(block).translated(self.contentOffset()).top()) bottom = top + int(self.blockBoundingRect(block).height()) # font_height = self.fontMetrics().height() while block.isValid() and top <= event.rect().bottom(): if block.isVisible() and bottom >= event.rect().top(): font_original = self.document().defaultFont() size = font_original.pointSize() font = painter.font() font.setPointSize(size) painter.setFont(font) number = str(blockNumber + 1) painter.setPen(Qt.black) painter.drawText(0, top, self.lineNumberArea.width(), self.fontMetrics().height(), Qt.AlignRight, number) block = block.next() top = bottom bottom = top + int(self.blockBoundingRect(block).height()) blockNumber += 1
def drawString(self, content, fontSize=256, color=QColor("red")): icon = self.icon() pixmap = icon.pixmap(512, 512) pixSize = pixmap.rect() painter = QPainter(pixmap) font = painter.font() font.setPixelSize(fontSize) painter.setFont(font) path = QPainterPath() path.addText(0, 0, font, content) pathBBox = path.boundingRect() xOffset = (pixSize.width() - pathBBox.width()) / 2 - pathBBox.left() yOffset = (pixSize.height() + pathBBox.height()) / 2 path.translate(xOffset, yOffset) ## paint shadow pathPen = QPen(QColor(0, 0, 0, 200)) pathPen.setWidth(180) painter.strokePath(path, pathPen) painter.fillPath(path, QBrush(color)) ## make number bolder pathPen = QPen(color) pathPen.setWidth(20) painter.strokePath(path, pathPen) painter.end() self.setIcon(QIcon(pixmap))
def paintEvent(self, ev) -> None: if self._text is not None: painter = QPainter(self) font = painter.font() fm = QFontMetrics(font) width = fm.width(self._text) painter.drawText(self.width() // 2 - width // 2, 14, self._text) painter.end()
def paintEvent(self, e): p = QPainter(self) p.setPen(p.pen()) p.setFont(p.font()) p.drawText( QPointF(self.x, (self.height() + self.fontMetrics().height()) / 2) + QPoint(2, -4), self.text_)
def paintTab(self, painter: QPainter, index: int): if not self.isValidIndex(index): return painter.save() tab = self._tabs[index] rect = self._tabRect(index) selected = index == self._currentIndex enabled = self._enabled and tab.enabled if selected: painter.fillRect(rect, FancyToolButtonSelectedColor) tabText = tab.text tabTextRect = QRect(rect) drawIcon = rect.height() > 36 tabIconRect = QRect(rect) tabTextRect.translate(0, -2 if drawIcon else 1) boldFont = QFont(painter.font()) boldFont.setPointSizeF(SIDEBAR_FONT_SIZE) boldFont.setBold(True) painter.setFont(boldFont) #painter.setPen(QColor(255, 255, 255, 160) if selected else QColor(0, 0, 0, 110)) textFlags = Qt.AlignCenter | (Qt.AlignBottom if drawIcon else Qt.AlignVCenter) | Qt.TextWordWrap fader = tab.fader if fader > 0 and not selected and enabled: painter.save() painter.setOpacity(fader) painter.fillRect(rect, FancyToolButtonHoverColor) painter.restore() if not enabled: painter.setOpacity(0.7) if drawIcon: textHeight = (painter.fontMetrics().boundingRect( QRect(0, 0, self.width(), self.height()), Qt.TextWordWrap, tabText).height()) tabIconRect.adjust(0, 4, 0, -textHeight - 4) iconMode = (QIcon.Active if selected else QIcon.Normal) if enabled else QIcon.Disabled iconRect = QRect(0, 0, MODEBAR_ICON_SIZE, MODEBAR_ICON_SIZE) iconRect.moveCenter(tabIconRect.center()) iconRect = iconRect.intersected(tabIconRect) drawIconWithShadow(tab.icon, iconRect, painter, iconMode) if enabled: penColor = FancyTabWidgetEnabledSelectedTextColor if selected else FancyTabWidgetEnabledUnselectedTextColor else: penColor = FancyTabWidgetDisabledSelectedTextColor if selected else FancyTabWidgetDisabledUnselectedTextColor painter.setPen(penColor) painter.translate(0, -1) painter.drawText(tabTextRect, textFlags, tabText) painter.restore()
def paintEvent(self, event): super().paintEvent(event) if self.hint: painter = QPainter(self.viewport()) hintText = QApplication.translate("EnhancedTreeView", "The list " "must contain at least one protection from type\nfence and " "from type tree shelter to complete a calculation!") fontMetrics = QFontMetrics(painter.font()) textWidth = fontMetrics.width(hintText) topPosition = self.rect().height() / 2 - 16 leftPosition = self.rect().width() / 2 - textWidth / 4 - 40 painter.drawImage(leftPosition, topPosition, QImage(os.path.join(self._OXYGEN_PATH_32, "dialog-warning.png"))) painter.setPen(QPen(QColor(0, 0, 0))) painter.drawText(self.rect(), Qt.AlignCenter, hintText)
def paintEvent(self, event): painter = QPainter(self) if self.isEnabled() and not self.isDown() and not self.isChecked(): painter.save() hover_color = QColor("#424242") faded_hover_color = QColor(hover_color) faded_hover_color.setAlpha(int(self._fader * hover_color.alpha())) painter.fillRect(event.rect(), faded_hover_color) painter.restore() elif self.isDown() or self.isChecked(): painter.save() selected_color = QColor("#161719") painter.fillRect(event.rect(), selected_color) painter.restore() is_titled = bool(self.defaultAction().property("titled")) icon_rect = QRect(0, 0, 32, 32) icon_rect.moveCenter(event.rect().center()) if is_titled: font = painter.font() center_rect = event.rect() font.setPointSizeF(6) fm = QFontMetrics(font) line_height = fm.height() text_flags = Qt.AlignHCenter | Qt.AlignTop project_name = self.defaultAction().property("heading") if project_name is not None: center_rect.adjust(0, line_height, 0, 0) icon_rect.moveTop(center_rect.top()) else: icon_rect.moveCenter(center_rect.center()) self.icon().paint(painter, icon_rect, Qt.AlignCenter) painter.setFont(font) r = QRect(0, 5, self.rect().width(), line_height) painter.setPen(Qt.white) margin = 5 available_width = r.width() - margin ellided_project_name = fm.elidedText( project_name, Qt.ElideMiddle, available_width) painter.drawText(r, text_flags, ellided_project_name) else: self.icon().paint(painter, icon_rect, Qt.AlignCenter)
def paintEvent(self, event): """This method draws a left sidebar :param event: QEvent """ bottom = self.editor.viewport().height() font_metrics = QFontMetrics(self.editor.document().defaultFont()) current_line = self.editor.document().findBlock( self.editor.textCursor().position()).blockNumber() + 1 painter = QPainter(self) painter.fillRect(1, 1, self.width(), self.height() - 2, QColor("#e8e8e8")) block = self.editor.firstVisibleBlock() vpoffset = self.editor.contentOffset() line = block.blockNumber() painter.setFont(self.editor.document().defaultFont()) while block.isValid(): line += 1 pos = self.editor.blockBoundingGeometry(block).topLeft() + vpoffset if pos.y() > bottom: break # Text bold font = painter.font() if current_line == line: font.setBold(True) else: font.setBold(False) painter.setFont(font) if block.isVisible(): painter.setPen(QColor("#9A9A9A")) fm_ascent = font_metrics.ascent() fm_descent = font_metrics.descent() painter.drawText(self.width() - font_metrics.width(str(line)) - 3, pos.y() + fm_ascent + fm_descent, str(line)) block = block.next() painter.end() QFrame.paintEvent(self, event)
def drawThumnail(self, cellNum, pic, thumb : PhotoNode, cell : Rectangle, painter : QPainter): rect = QRect(cell.x, cell.y, cell.width, cell.height) bLeft = rect.bottomLeft() # draw name fontHeight = 20 font = painter.font() font.setPixelSize(fontHeight) textTopRight = QPoint(bLeft.x(), bLeft.y() - fontHeight) textRect = QRect(textTopRight, rect.bottomRight()) thumbName = thumb.name painter.drawText(textRect, Qt.AlignHCenter, thumbName) #painter.drawRect(rect) # draw thumb imageRect = QRect(rect.topLeft(), textRect.topRight()) imageCenter = imageRect.center() imageX = int(imageCenter.x() - pic.width() / 2) imageY = int(imageCenter.y() - pic.height() / 2) imageOrigin = QPoint(imageX, imageY) painter.drawPixmap(imageOrigin, pic)
def paintEvent(self, event): page_bottom = self.edit.viewport().height() font_metrics = QFontMetrics(self.edit.document().defaultFont()) current_block = self.edit.document().findBlock( self.edit.textCursor().position()) pattern = self.pat if self.edit.lang == "python" else self.patNotPython painter = QPainter(self) background = resources.CUSTOM_SCHEME.get('sidebar-background', resources.COLOR_SCHEME['sidebar-background']) foreground = resources.CUSTOM_SCHEME.get('sidebar-foreground', resources.COLOR_SCHEME['sidebar-foreground']) pep8color = resources.CUSTOM_SCHEME.get('pep8-underline', resources.COLOR_SCHEME['pep8-underline']) errorcolor = resources.CUSTOM_SCHEME.get('error-underline', resources.COLOR_SCHEME['error-underline']) migrationcolor = resources.CUSTOM_SCHEME.get('migration-underline', resources.COLOR_SCHEME['migration-underline']) painter.fillRect(self.rect(), QColor(background)) block = self.edit.firstVisibleBlock() viewport_offset = self.edit.contentOffset() line_count = block.blockNumber() painter.setFont(self.edit.document().defaultFont()) while block.isValid(): line_count += 1 # The top left position of the block in the document position = self.edit.blockBoundingGeometry(block).topLeft() + \ viewport_offset # Check if the position of the block is outside of the visible area if position.y() > page_bottom: break # Set the Painter Pen depending on special lines error = False if settings.CHECK_STYLE and \ ((line_count - 1) in self._pep8Lines): painter.setPen(QColor(pep8color)) font = painter.font() font.setItalic(True) font.setUnderline(True) painter.setFont(font) error = True elif settings.FIND_ERRORS and \ ((line_count - 1) in self._errorsLines): painter.setPen(QColor(errorcolor)) font = painter.font() font.setItalic(True) font.setUnderline(True) painter.setFont(font) error = True elif settings.SHOW_MIGRATION_TIPS and \ ((line_count - 1) in self._migrationLines): painter.setPen(QColor(migrationcolor)) font = painter.font() font.setItalic(True) font.setUnderline(True) painter.setFont(font) error = True else: painter.setPen(QColor(foreground)) # We want the line number for the selected line to be bold. bold = False if block == current_block: bold = True font = painter.font() font.setBold(True) painter.setFont(font) # Draw the line number right justified at the y position of the # line. 3 is a magic padding number. drawText(x, y, text). if block.isVisible(): painter.drawText(self.width() - self.foldArea - font_metrics.width(str(line_count)) - 3, round(position.y()) + font_metrics.ascent() + font_metrics.descent() - 1, str(line_count)) # Remove the bold style if it was set previously. if bold: font = painter.font() font.setBold(False) painter.setFont(font) if error: font = painter.font() font.setItalic(False) font.setUnderline(False) painter.setFont(font) block = block.next() self.highest_line = line_count #Code Folding xofs = self.width() - self.foldArea painter.fillRect(xofs, 0, self.foldArea, self.height(), QColor(resources.CUSTOM_SCHEME.get('fold-area', resources.COLOR_SCHEME['fold-area']))) if self.foldArea != self.rightArrowIcon.width(): polygon = QPolygonF() self.rightArrowIcon = QPixmap(self.foldArea, self.foldArea) self.rightArrowIcon.fill(Qt.transparent) self.downArrowIcon = QPixmap(self.foldArea, self.foldArea) self.downArrowIcon.fill(Qt.transparent) polygon.append(QPointF(self.foldArea * 0.4, self.foldArea * 0.25)) polygon.append(QPointF(self.foldArea * 0.4, self.foldArea * 0.75)) polygon.append(QPointF(self.foldArea * 0.8, self.foldArea * 0.5)) iconPainter = QPainter(self.rightArrowIcon) iconPainter.setRenderHint(QPainter.Antialiasing) iconPainter.setPen(Qt.NoPen) iconPainter.setBrush(QColor( resources.CUSTOM_SCHEME.get('fold-arrow', resources.COLOR_SCHEME['fold-arrow']))) iconPainter.drawPolygon(polygon) polygon.clear() polygon.append(QPointF(self.foldArea * 0.25, self.foldArea * 0.4)) polygon.append(QPointF(self.foldArea * 0.75, self.foldArea * 0.4)) polygon.append(QPointF(self.foldArea * 0.5, self.foldArea * 0.8)) iconPainter = QPainter(self.downArrowIcon) iconPainter.setRenderHint(QPainter.Antialiasing) iconPainter.setPen(Qt.NoPen) iconPainter.setBrush(QColor( resources.CUSTOM_SCHEME.get('fold-arrow', resources.COLOR_SCHEME['fold-arrow']))) iconPainter.drawPolygon(polygon) block = self.edit.firstVisibleBlock() while block.isValid(): position = self.edit.blockBoundingGeometry( block).topLeft() + viewport_offset #Check if the position of the block is outside of the visible area if position.y() > page_bottom: break if pattern.match(block.text()) and block.isVisible(): if block.blockNumber() in self._foldedBlocks: painter.drawPixmap(xofs, round(position.y()), self.rightArrowIcon) else: painter.drawPixmap(xofs, round(position.y()), self.downArrowIcon) #Add Bookmarks and Breakpoint elif block.blockNumber() in self._breakpoints: linear_gradient = QLinearGradient( xofs, round(position.y()), xofs + self.foldArea, round(position.y()) + self.foldArea) linear_gradient.setColorAt(0, QColor(255, 11, 11)) linear_gradient.setColorAt(1, QColor(147, 9, 9)) painter.setRenderHints(QPainter.Antialiasing, True) painter.setPen(Qt.NoPen) painter.setBrush(QBrush(linear_gradient)) painter.drawEllipse( xofs + 1, round(position.y()) + 6, self.foldArea - 1, self.foldArea - 1) elif block.blockNumber() in self._bookmarks: linear_gradient = QLinearGradient( xofs, round(position.y()), xofs + self.foldArea, round(position.y()) + self.foldArea) linear_gradient.setColorAt(0, QColor(13, 62, 243)) linear_gradient.setColorAt(1, QColor(5, 27, 106)) painter.setRenderHints(QPainter.Antialiasing, True) painter.setPen(Qt.NoPen) painter.setBrush(QBrush(linear_gradient)) painter.drawRoundedRect( xofs + 1, round(position.y()) + 6, self.foldArea - 2, self.foldArea - 1, 3, 3) block = block.next()# block = next(block) painter.end() super(SidebarWidget, self).paintEvent(event)
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) angle_step = 360 / self.n_states painter.save() painter.translate(self.dist_center.x(), self.dist_center.y()) #painter.drawRect(- self.dist_radius, - self.dist_radius, self.dist_radius *2,self.dist_radius*2) #painter.drawEllipse(QPoint(0, 0), self.dist_radius , self.dist_radius) painter.rotate(-180) #to start painting from the left side of the circle x = self.dist_radius * math.cos(0) y = self.dist_radius * math.sin(0) for h in range(self.n_states): rot = angle_step * h painter.save() painter.rotate(rot) painter.translate(x,y) if self.machine.getState(h).isActive(): painter.setBrush(self.greenGradientBrush) painter.drawEllipse(QPoint(0,0), self.state_radius, self.state_radius) #global position of transformed coordinates gx = painter.worldTransform().map(QPoint(0,0)).x() gy = painter.worldTransform().map(QPoint(0,0)).y() self.machine.getState(h).setPos(gx, gy) # text transformation painter.save() painter.rotate(180) painter.rotate(-rot) font = painter.font(); font.setPixelSize(self.state_radius*.4); painter.setFont(font); rect = QRect(-self.state_radius, -self.state_radius, self.state_radius*2, self.state_radius*2) painter.drawText(rect, Qt.AlignCenter, self.machine.getState(h).getName()); painter.restore() #end text transformation painter.restore() painter.restore() #drawing transitions. painter.save() pptv = QTransform() pptv.translate(0, self.height()) pptv.rotate(-180, Qt.XAxis) painter.setTransform(pptv) s = self.machine.getStates() for j in s: t = j.getTransitions() for i in t: #get the points in the canvas init = QPoint(j.getPos()[0], j.getPos()[1]) end = QPoint(self.machine.getState(i.getStateEnd()).getPos()[0], self.machine.getState(i.getStateEnd()).getPos()[1]) # get the transformed ponts init2 = QPoint(painter.worldTransform().map(init)) end2 = QPoint(painter.worldTransform().map(end)) #get the angle between states centers angle = math.atan2(end2.y() - init2.y(), end2.x() - init2.x()) #get the coordinates of the starting point of the transition (it starts in the bound, not in the center) newX = self.state_radius * math.cos(angle) + init2.x() newY = self.state_radius * math.sin(angle) + init2.y() init2.setX(newX) init2.setY(newY) #same for the end of the transition angle2 = math.atan2(init2.y() - end2.y(), init2.x() - end2.x()) newX2 = self.state_radius * math.cos(angle2) + end2.x() newY2 = self.state_radius * math.sin(angle2) + end2.y() end2.setX(newX2) end2.setY(newY2) #painter.drawLine(init, end) painter.drawLine(init2, end2) init = QPoint(painter.worldTransform().map(init2)) end = QPoint(painter.worldTransform().map(end2)) i.setOrig(init.x(), init.y()) i.setDest(end.x(), end.y()) i.setAngle(angle) #painter.draw painter.restore() painter.setPen(QPen(QColor(Qt.gray), 3)) for i in machine.getStates(): for j in i.getTransitions(): i = QPoint(j.getOrig()[0], j.getOrig()[1]) o = QPoint(j.getDest()[0], j.getDest()[1]) painter.drawPolyline(i, o) painter.save() painter.setPen(QPen(QColor(Qt.gray), 2)) painter.translate(j.getDest()[0],j.getDest()[1]) painter.rotate(90 - j.getAngle()*180/math.pi) a = QPoint(0,0) b = QPoint(-5,10) c = QPoint(5,10) a1 = painter.worldTransform().map(a) b1 = painter.worldTransform().map(b) c1 = painter.worldTransform().map(c) pointer = QPolygon([a,b,c]) painter.drawPolygon(pointer) painter.restore() painter.save() if j.isActive(): t = self.machine.getTransition(self.t_active) init = QPoint(t.getOrig()[0], t.getOrig()[1]) end = QPoint(t.getDest()[0], t.getDest()[1]) painter.setPen(QPen(QColor(Qt.green), 3)) painter.drawPolyline(init, end) painter.setPen(QPen(QColor(Qt.gray), 3)) painter.drawPolyline(self.poly(self.pts)) painter.setBrush(QBrush(QColor(255, 0, 0))) painter.setPen(QPen(QColor(Qt.red), 2)) pointer = QPolygon([a1,b1,c1]) painter.drawPolygon(pointer) painter.setBrush(QBrush(QColor(255, 0, 0))) painter.setPen(QPen(QColor(Qt.black), 1)) painter.restore() #Ball that follows the line #for x, y in self.pts: #painter.drawEllipse(QRectF(x - 4, y - 4, 8, 8)) painter.save() pptv = QTransform() painter.setPen(QPen(QColor(Qt.black), 3)) middleX = (j.getOrig()[0] + j.getDest()[0]) /2 middleY = (j.getOrig()[1] + j.getDest()[1]) /2 pptv.translate(middleX, middleY) #pptv.rotate(-j.getAngle()*180/math.pi) painter.setTransform(pptv) font = painter.font(); font.setPixelSize(self.state_radius*.3); painter.setFont(font); rect = QRect(-self.state_radius, -self.state_radius, self.state_radius*2, self.state_radius*2) name = str(j.getId())+ '. ' + j.getName() painter.drawText(rect, Qt.AlignCenter, name) painter.restore() painter.setPen(self.palette().dark().color()) painter.setBrush(Qt.NoBrush) painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
def paintEvent(self, event): painter = QPainter(self) painter.setPen(self.pen) painter.setBrush(self.brush) if self.antialiased: painter.setRenderHint(QPainter.Antialiasing) angle_step = 360 / self.n_states painter.save() #Save_1. Save the state of the system (push matrix) painter.translate(self.dist_center.x(), self.dist_center.y()) # go to the center of the render area painter.rotate(-180) #to start painting from the left side of the circle (clockwise) #center of the circumference where through we are going to paint our states x = self.dist_radius * math.cos(0) y = self.dist_radius * math.sin(0) for h in range(self.n_states): rot = angle_step * h # each state is equidistant from the others. We paint them in circles painter.save() #Save_2 painter.rotate(rot) #now our system is pointing to the next state to be drawn painter.translate(x,y) #now our origin is in the center of the next state to be drawn #if the state is active, fill it green if self.machine.getState(h).isActive(): painter.setBrush(self.greenGradientBrush) painter.drawEllipse(QPoint(0,0), self.state_radius, self.state_radius) #draw the new state #global position of transformed coordinates (before any transformation, origin at top-left corner) gx = painter.worldTransform().map(QPoint(0,0)).x() gy = painter.worldTransform().map(QPoint(0,0)).y() self.machine.getState(h).setPos(gx, gy) #store the center of the state without any transformation applied # text transformation. Our origin is still in the center of the current state painter.save() #Save_3 painter.rotate(180) #making the text go vertical painter.rotate(-rot) #undoing the rotation made for painting the state. No the text is horizontal font = painter.font(); font.setPixelSize(self.state_radius*.4); painter.setFont(font); rect = QRect(-self.state_radius, -self.state_radius, self.state_radius*2, self.state_radius*2) painter.drawText(rect, Qt.AlignCenter, self.machine.getState(h).getName()); painter.restore() #Restore_3 #end text transformation painter.restore() #Restore_2 painter.restore() #Restore_1. Restore the state of the system (pop matrix) #drawing transitions. Line between states painter.save() # Save_4 pptv = QTransform() #Define a new transformation. Needed to rotate the system along other axis than Z pptv.translate(0, self.height()) #We are now at the bottom-left corner of the screen pptv.rotate(-180, Qt.XAxis) #Rotate along the X-axis so now we are in a typical cartesian system. painter.setTransform(pptv) #Apply the transformation states = self.machine.getStates() for state in states: transitions = state.getTransitions() for transition in transitions: #get the center of the origin and destination states in our current system state orig = QPoint(state.getPos()[0], state.getPos()[1]) end = QPoint(self.machine.getState(transition.getStateEnd()).getPos()[0], self.machine.getState(transition.getStateEnd()).getPos()[1]) # get those coordinates without transformation orig2 = QPoint(painter.worldTransform().map(orig)) end2 = QPoint(painter.worldTransform().map(end)) #get the angle between states centers and the horizon angle = math.atan2(end2.y() - orig2.y(), end2.x() - orig2.x()) #get the coordinates of the starting point of the transition (it starts in the bound of the state, not in the center) newX = self.state_radius * math.cos(angle) + orig2.x() newY = self.state_radius * math.sin(angle) + orig2.y() #now the transition starts at the border, not in the center orig2.setX(newX) orig2.setY(newY) #same for the destination state angle2 = math.atan2(orig2.y() - end2.y(), orig2.x() - end2.x()) newX2 = self.state_radius * math.cos(angle2) + end2.x() newY2 = self.state_radius * math.sin(angle2) + end2.y() end2.setX(newX2) end2.setY(newY2) #draw the line between the origin and destination states painter.drawLine(orig2, end2) #get the start and the end of the transition untransformed init = QPoint(painter.worldTransform().map(orig2)) end = QPoint(painter.worldTransform().map(end2)) #store that info transition.setOrig(init.x(), init.y()) transition.setDest(end.x(), end.y()) transition.setAngle(angle) painter.restore() #Restore_4 #Appliying style to the transitions painter.setPen(QPen(QColor(Qt.gray), 3)) for state in self.machine.getStates(): for transition in state.getTransitions(): #get the start and end coordinates of the transition i = QPoint(transition.getOrig()[0], transition.getOrig()[1]) o = QPoint(transition.getDest()[0], transition.getDest()[1]) painter.drawPolyline(i, o) #Drawing the arrow at the end of the transition painter.save() #Save_5 painter.setPen(QPen(QColor(Qt.gray), 2)) painter.translate(transition.getDest()[0],transition.getDest()[1]) #Go to the end of the transition painter.rotate(90 - transition.getAngle()*180/math.pi) #Rotate to point in the direction of the transition #coordinates of the arrow (triangle) a = QPoint(0,0) b = QPoint(-5,10) c = QPoint(5,10) #coordinates of the arrow untransformed a1 = painter.worldTransform().map(a) b1 = painter.worldTransform().map(b) c1 = painter.worldTransform().map(c) #Drawin the actual arrow pointer = QPolygon([a,b,c]) painter.drawPolygon(pointer) painter.restore() #Restore_5 #For the animation of the transition painter.save() #Save_6 if transition.isActive(): #if the current transition is the active one the wave function will be running, so it's updating the canvas painter.setPen(QPen(QColor(Qt.green), 3)) painter.drawPolyline(i,o) painter.setPen(QPen(QColor(Qt.gray), 3)) painter.drawPolyline(self.poly(self.pts)) #Draw the arrow in the active state (red arrow) painter.setBrush(QBrush(QColor(255, 0, 0))) painter.setPen(QPen(QColor(Qt.red), 2)) pointer = QPolygon([a1,b1,c1]) painter.drawPolygon(pointer) #Ball that follows the line animation for x, y in self.pts: painter.drawEllipse(QRectF(self.pts[0][0] - 4, self.pts[0][1] - 4, 8, 8)) painter.restore() #Restore_6 #Painting the text of the transition painter.save() #Save_7 pptv = QTransform() painter.setPen(QPen(QColor(Qt.black), 3)) #get the middle point of the transition middleX = (transition.getOrig()[0] + transition.getDest()[0]) /2 middleY = (transition.getOrig()[1] + transition.getDest()[1]) /2 pptv.translate(middleX, middleY) #translate to that point painter.setTransform(pptv) #apply the transformation font = painter.font(); font.setPixelSize(self.state_radius*.2); painter.setFont(font); rect = QRect(-self.state_radius, -self.state_radius, self.state_radius*2, self.state_radius*2) name = str(transition.getId())+ '. ' + transition.getName() painter.drawText(rect, Qt.AlignCenter, name) painter.restore() #Restore_7 #paint the actual canvas painter.setPen(self.palette().dark().color()) painter.setBrush(Qt.NoBrush) painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))