def boundingRect(self) -> QtCore.QRectF: rect = super().boundingRect() view = next(iter(self.scene().views()), None) if view is None: return rect dist = view.mapToScene(QtCore.QRect(0, 0,self.cursor_dist, 1)).boundingRect().width() return rect.marginsAdded(QtCore.QMarginsF(dist, dist, dist, dist))
def save_pdf(self, path, dpi=200): cmax = 4 self.view.progress.update_state(text="Rendering...", value=1, maximum=cmax) if self.view.progress.cancel_pressed(): return self.scene().clearSelection() scale = self.get_scale() scale_tgt = SCALE_CUTOFF * 2 if scale < scale_tgt: self.scale_view(scale_tgt / scale) rect = self.scene().itemsBoundingRect() m = min(rect.width(), rect.height()) * 0.05 rect = rect.marginsAdded(QtCore.QMarginsF(m, m, m, m)) w, h = rect.width(), rect.height() self.view.progress.update_state(text="Rendering...", value=2, maximum=cmax) if self.view.progress.cancel_pressed(): return printer = QtPrintSupport.QPrinter() printer.setWinPageSize(QtGui.QPageSize.A4) printer.setFullPage(True) printer.setOrientation(QtPrintSupport.QPrinter.Landscape) printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat) printer.setOutputFileName(path) size = printer.pageLayout().pageSize().sizePoints() pw, ph = size.height(), size.width() scale = min(pw / w, ph / h) printer.setResolution(int(round(dpi / scale))) ph = int(round(h * (pw / w))) printer.setPageSize( QtGui.QPageSize(QtCore.QSize(ph, pw), units=QtGui.QPageSize.Point)) painter = QtGui.QPainter(printer) self.view.progress.update_state(text="Rendering...", value=3, maximum=cmax) if self.view.progress.cancel_pressed(): painter.end() os.remove(path) return self.scene().render(painter, source=rect) painter.end() self.view.progress.update_state(text="Rendering...", value=4, maximum=cmax)
def zoom(self, direction=None): if direction is None: rect = self.scene.itemsBoundingRect().marginsAdded( QtCore.QMarginsF(10, 10, 10, 10)) self.setSceneRect(rect) self.fitInView(rect, QtCore.Qt.KeepAspectRatio) else: factor = 1 if direction == 1: factor = 1.1 elif direction == -1: factor = 0.9 self.scale(factor, factor)
def save_pdf(self, path, dpi=72): self.scene().clearSelection() scale = self.get_scale() rect = self.scene().itemsBoundingRect() m = min(rect.width(), rect.height()) * 0.05 rect = rect.marginsAdded(QtCore.QMarginsF(m, m, m, m)) w, h = rect.width(), rect.height() printer = QtPrintSupport.QPrinter() printer.setWinPageSize(QtGui.QPageSize.A4) printer.setFullPage(True) is_landscape = False if w > h: is_landscape = True printer.setOrientation(QtPrintSupport.QPrinter.Landscape) else: printer.setOrientation(QtPrintSupport.QPrinter.Portrait) printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat) printer.setOutputFileName(path) size = printer.pageLayout().pageSize().sizePoints() if is_landscape: pw, ph = size.height(), size.width() else: pw, ph = size.width(), size.height() scale = min(pw / w, ph / h) printer.setResolution(int(round(dpi / scale))) ph = int(round(h * (pw / w))) if is_landscape: printer.setPageSize( QtGui.QPageSize(QtCore.QSize(ph, pw), units=QtGui.QPageSize.Point)) else: printer.setPageSize( QtGui.QPageSize(QtCore.QSize(pw, ph), units=QtGui.QPageSize.Point)) painter = QtGui.QPainter(printer) self.scene().render(painter, source=rect) painter.end()
def boundingRect(self) -> QtCore.QRectF: view = next(iter(self.scene().views())) angle = self.line.angle() fm = QtGui.QFontMetrics(self.font) text = fm.boundingRect(self.text) text = view.mapToScene(text).boundingRect() # Corners above the text height n1 = QtCore.QLineF(self.line.p2(), self.line.p1()).normalVector() n2 = QtCore.QLineF(self.line.p1(), self.line.p2()).normalVector() if 90 < angle < 270: n1.setLength(text.height()) n2.setLength(-text.height()) else: n1.setLength(-text.height()) n2.setLength(text.height()) poly = QtGui.QPolygonF([self.line.p1(), n1.p2(), n2.p2(), self.line.p2()]) w = view.mapToScene(QtCore.QRect(0, 0, 5, 1)).boundingRect().width() return poly.boundingRect().marginsAdded(QtCore.QMarginsF(w, w, w, w))
def reset_scene(self): rect = self.scene().itemsBoundingRect().marginsAdded( QtCore.QMarginsF(10, 10, 10, 10)) self.setSceneRect(rect) self.fitInView(rect, QtCore.Qt.KeepAspectRatio)