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 paintEvent(self, event: QPaintEvent): super().paintEvent(event) if self._viewport_anchoring_scheduled: self._anchor_viewport() self._viewport_anchoring_scheduled = False painter = QPainter(self.viewport()) painter.setRenderHint(QPainter.Antialiasing) painter.setBrush(QColor(123, 184, 234)) painter.setPen(QPen(Qt.white, 0.5)) scale_text = f'{self._cur_scale * 100:.0f}%' scale_text_bounding_rect = self._scale_font_metrics.boundingRect( scale_text) viewport_rect = self.viewport().rect() # Align the scale text to (Qt.AlignHCenter | Qt.AlignBottom) pad = 2 self._scale_text_rect = QRect(viewport_rect.width() / 2 - scale_text_bounding_rect.width() / 2, viewport_rect.height() - scale_text_bounding_rect.height() - 6, scale_text_bounding_rect.width(), scale_text_bounding_rect.height())\ .adjusted(-pad, -pad, pad, pad) # add pads to update when scrolling without artifacts # Use QPainterPath to draw text with outline path = QPainterPath() path.addText(self._scale_text_rect.bottomLeft(), self._scale_font, scale_text) painter.drawPath(path)
def test_text(self, p, opd): font = QFont() path = QPainterPath() path.addText(0, 0, font, "T") p.drawPath(path) lines = opd.getOutlines() assert len(lines) == 1
def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: Optional[QWidget]) -> None: # Draw a circle for the node pen = QPen(Qt.gray) pen.setWidth(2) pen.setCosmetic(True) # Combine ideas from these code samples to draw items at a fixed size: # https://stackoverflow.com/questions/1222914/qgraphicsview-and-qgraphicsitem-don%C2%B4t-scale-item-when-scaling-the-view-rect # https://www.qtcentre.org/threads/28691-Scale-independent-QGraphicsItem object_rect = self.boundingRect() mapped_rect = painter.transform().mapRect(object_rect) width_ratio = object_rect.width() / mapped_rect.width() scale_factor = max(1, width_ratio) painter.setPen(pen) painter.setBrush(Qt.gray) scaled_diameter = self.diameter * scale_factor painter.drawEllipse((self.x - scaled_diameter / 2), (self.y - scaled_diameter / 2), scaled_diameter, scaled_diameter) # Draw text for the node name label_path = QPainterPath() label_font = QFont("Calibri", 10 * scale_factor) label_path.addText(self.x, -self.y - self.diameter / 2, label_font, self.name) painter.scale(1.0, -1.0) painter.setBrush(Qt.blue) painter.setPen(Qt.NoPen) painter.drawPath(label_path)