Teilkreislinie ohne Winkellinie zeichnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Als nächstes möchte ich die Fensterausgabe als PDF ausdrucken.
Dazu habe ich dies hier https://doc.qt.io/qtforpython-6/overvie ... sview.html gefunden.
Ich habe dies folgendermaßen umgesetzt:

Code: Alles auswählen

import sys
from PyQt5.QtCore import (
	Qt,
	QEvent,
	QRectF
	)
from PyQt5.QtWidgets import (
	QApplication,
	QDialog,
	QGraphicsView,
	QGraphicsScene,
	QGraphicsItem,
	QGraphicsEllipseItem,
	)
from PyQt5.QtGui import  (
	QPen,
	QBrush,
	QPixmap,
	QPainter,
	QPdfWriter,
	QPagedPaintDevice
	)
from PyQt5.QtPrintSupport import (
	QPrinter,
	QPrintDialog,
	QPrintPreviewDialog
	)

class GeometryDraw(QGraphicsView):
	def __init__(self, ellipses=[]):
		super().__init__()

		if ellipses == []:
			return
		self.viewport().installEventFilter(self)
		self.scene = QGraphicsScene(self)
		self.setScene(self.scene)
		self.setCacheMode(QGraphicsView.CacheBackground)
		self.ellipses(ellipses)
		self.show()

	def ellipses(self, ellipses):
		for x, y, d, start_angle, span_angle, color in ellipses:
			item = QGraphicsEllipseItem(x, y, d, d)
			item.setStartAngle(start_angle)
			item.setSpanAngle(span_angle)
			self.finish(color, item)

	def finish(self, color, item):
		pen = QPen()
		pen.setBrush(QBrush(color))
		item.setPen(pen)
		item.setFlags(QGraphicsItem.ItemIsMovable |
			QGraphicsItem.ItemIsSelectable)
		self.scene.addItem(item)


def main():
	app = QApplication(sys.argv)
	screen = app.screens()[0]
	dpi = screen.physicalDotsPerInch()
	f = factor = dpi/25.4
	# data to draw
	start_angle = int(0*16)
	alpha = 121.081
	span_angle = int(alpha*16)
	r0 = 148.660
	r1 = 74.330
	circles = [
		(-r0*factor, -r0*f, r0*f*2, start_angle, span_angle, Qt.green),
		(-r1*factor, -r1*f, r1*f*2, start_angle, span_angle, Qt.green),
		]
	# draw geometry
	GD = GeometryDraw(ellipses=circles)
	# print
	scene = GD.scene
	try:
		#scene.addRect(QRectF(0, 0, 800, 1000), QPen(Qt.black),
		#	QBrush(Qt.green))
		printer = QPrinter()
		if QPrintDialog(printer).exec() == QDialog.Accepted:
			painter = QPainter(printer)
			painter.setRenderHint(QPainter.Antialiasing)
			scene.render(painter)
	except AttributeError:
		pass
	sys.exit(app.exec_())

if __name__ == '__main__':
	main()
Mit meinem integrierten PDF-Drucker über die Druckerauswahl, starte ich den Druck.
Eine PDF-Datei wird erstellt, leider erhalte ich beim Versuch die Datei zu öffnen eine Fehlermeldung "Datei kann nicht geöffnet werden".

Vielleicht fällt Euch auf, welchen Fehler ich dabei gemacht habe.
Ich habe die mit und ohne scene.addRect versucht.

Grüße Nobuddy
Nobuddy
User
Beiträge: 997
Registriert: Montag 30. Januar 2012, 16:38

Nach längerem, bin ich auf die Lösung gekommen.
Ich habe versucht scene an den Drucker weiterzugeben, was falsch war.
Die Schnittstelle ist QGraphicsView.

Ich habe QPrintPreviewDialog verwendet, um gleich das Druckresultat vor Druck zu sehen.

Code: Alles auswählen

import sys
from PyQt5.QtCore import (
	Qt,
	QEvent,
	QRectF
	)
from PyQt5.QtWidgets import (
	QApplication,
	QDialog,
	QGraphicsView,
	QGraphicsScene,
	QGraphicsItem,
	QGraphicsEllipseItem,
	)
from PyQt5.QtGui import  (
	QPen,
	QBrush,
	QPixmap,
	QPainter,
	QPdfWriter,
	QPagedPaintDevice
	)
from PyQt5.QtPrintSupport import (
	QPrinter,
	QPrintDialog,
	QPrintPreviewDialog
	)


class GeometryDraw(QGraphicsView):
	def __init__(self, ellipses=[]):
		super().__init__()

		if ellipses == []:
			return
		self.viewport().installEventFilter(self)
		self.scene = QGraphicsScene(self)
		self.setScene(self.scene)
		self.setCacheMode(QGraphicsView.CacheBackground)
		self.ellipses(ellipses)
		self.show()
		self.handle_preview()

	def ellipses(self, ellipses):
		for x, y, d, start_angle, span_angle, color in ellipses:
			item = QGraphicsEllipseItem(x, y, d, d)
			item.setStartAngle(start_angle)
			item.setSpanAngle(span_angle)
			self.finish(color, item)

	def finish(self, color, item):
		pen = QPen()
		pen.setBrush(QBrush(color))
		item.setPen(pen)
		item.setFlags(QGraphicsItem.ItemIsMovable |
			QGraphicsItem.ItemIsSelectable)
		self.scene.addItem(item)

	def handle_preview(self):
		dialog = QPrintPreviewDialog()
		dialog.paintRequested.connect(self.handle_paint_request)
		dialog.exec_()

	def handle_paint_request(self, printer):
		printer.setFullPage(True)
		painter = QPainter(printer)
		grafic = self.rect()
		painter.setViewport(grafic)
		painter.setWindow(grafic)
		self.render(painter)
		painter.end()


def main():

	app = QApplication(sys.argv)
	screen = app.screens()[0]
	dpi = screen.physicalDotsPerInch()
	f = factor = dpi/25.4
	# data to draw
	start_angle = int(0*16)
	alpha = 121.081
	span_angle = int(alpha*16)
	r0 = 148.660
	r1 = 74.330
	circles = [
		(-r0*factor, -r0*f, r0*f*2, start_angle, span_angle, Qt.green),
		(-r1*factor, -r1*f, r1*f*2, start_angle, span_angle, Qt.green),
		]
	# draw geometry
	GD = GeometryDraw(ellipses=circles)
	sys.exit(app.exec_())

if __name__ == '__main__':
	main()
Antworten