def GetTextSizeFromPainter(painter: QG.QPainter, text: str): try: text_size = painter.fontMetrics().size(QC.Qt.TextSingleLine, text) except ValueError: from hydrus.client.metadata import ClientTags if not ClientTags.have_shown_invalid_tag_warning: from hydrus.core import HydrusData HydrusData.ShowText( 'Hey, I think hydrus stumbled across an invalid tag! Please run _database->check and repair->fix invalid tags_ immediately, or you may get errors!' ) bad_text = repr(text) bad_text = HydrusText.ElideText(bad_text, 24) HydrusData.ShowText('The bad text was: {}'.format(bad_text)) ClientTags.have_shown_invalid_tag_warning = True text = '*****INVALID, UNDISPLAYABLE TAG, RUN DATABASE REPAIR NOW*****' text_size = painter.fontMetrics().size(QC.Qt.TextSingleLine, text) return (text_size, text)
def draw_entry_labels(painter: QPainter, geom: NodeGeometry, state: NodeState, model: NodeDataModel, node_style: NodeStyle): """ Draw entry labels Parameters ---------- painter : QPainter geom : NodeGeometry state : NodeState model : NodeDataModel node_style : NodeStyle """ metrics = painter.fontMetrics() for port in state.ports: scene_pos = port.scene_position if not port.connections: painter.setPen(node_style.font_color_faded) else: painter.setPen(node_style.font_color) display_text = port.display_text rect = metrics.boundingRect(display_text) scene_pos.setY(scene_pos.y() + rect.height() / 4.0) if port.port_type == PortType.input: scene_pos.setX(5.0) elif port.port_type == PortType.output: scene_pos.setX(geom.width - 5.0 - rect.width()) painter.drawText(scene_pos, display_text)
def paintEvent(self, event): super().paintEvent(event) painter = QPainter(self) font_metrics = painter.fontMetrics() text_layout = QTextLayout(self._text, painter.font()) text_layout.beginLayout() y = 0 while True: line = text_layout.createLine() if not line.isValid(): break line.setLineWidth(self.width()) nextLineY = y + font_metrics.lineSpacing() if self.height() >= nextLineY + font_metrics.lineSpacing(): line.draw(painter, QPoint(0, y)) y = nextLineY else: lastLine = self._text[line.textStart():] elidedLastLine = font_metrics.elidedText( lastLine, Qt.ElideRight, self.width()) painter.drawText(QPoint(0, y + font_metrics.ascent()), elidedLastLine) line = text_layout.createLine() break text_layout.endLayout()
def get_font_array(sz, chars=DEFAULT_CHARS): from qtpy.QtGui import QFont, QPainter, QColor font = QFont() font.setFixedPitch(True) font.setPixelSize(int(sz)) font.setStyleStrategy(QFont.NoAntialias) dummy = QImage(10, 10, QImage.Format_ARGB32) pnt = QPainter(dummy) pnt.setFont(font) metric = pnt.fontMetrics() rct = metric.boundingRect(chars) pnt.end() h = rct.height() w = rct.width() img = QImage(w, h, QImage.Format_ARGB32) paint = QPainter() paint.begin(img) paint.setFont(font) paint.setBrush(QColor(255, 255, 255)) paint.setPen(QColor(255, 255, 255)) paint.drawRect(0, 0, w + 1, h + 1) paint.setPen(QColor(0, 0, 0)) paint.setBrush(QColor(0, 0, 0)) paint.drawText(0, paint.fontMetrics().ascent(), chars) paint.end() try: try: # PyQt4 (at least until Qt 4.8) data = img.bits().asstring(img.numBytes()) except AttributeError: if PYSIDE2: # PySide2 data = bytes(img.bits()) else: # PyQt5 data = img.bits().asstring(img.byteCount()) except SystemError: # PyQt4 (4.11.3) and PyQt5 (5.3.2) on Python 3 return npy = np.frombuffer(data, np.uint8) npy.shape = img.height(), int(img.bytesPerLine() / 4), 4 return npy[:, :, 0]