У меня есть окно с QGraphicsScene в качестве рисовальщика, и я хочу отобразить его элементы в pdf-файл при нажатии кнопки.
def generateReport(self):
lineList = {}
for i in self.circleList:
for j,k in i.lineItems:
if j not in lineList:
lineList[j] = [i, k]
printed = QPdfWriter("Output.pdf")
printed.setPageSize(QPagedPaintDevice.A4)
printer = QPainter(printed)
self.painter.render(printer)
for i,j in enumerate(lineList):
# j.scene().render(printer)
# lineList[j][0].scene().render(printer)
# lineList[j][1].scene().render(printer)
printer.drawText(0, self.painter.height() + i*200, f'{j.nameItem.toPlainText()}: {lineList[j][0].m_items[4].toPlainText()}, {lineList[j][1].m_items[4].toPlainText()}')
printer.end()
nameItem на j - это метка имени строки, m_items [4] - это метка имени для каждого круга.
Моя проблема в том, что я не могу получить точную высоту отрисованной сцены, более того, я не знаю, как можно переполнить текст до на следующей странице, если содержимое не помещается в одну.
было бы замечательно, если бы я мог каким-то образом визуализировать каждую строку и соответствующие ей кружки отдельно для каждого соединения, сохраненные в lineList
примечание: строка ребенок каждого круга, а имена каждой строки и круга - их дети, реализованные во многом таким же образом, как и ответ на мой предыдущий вопрос , где лежит мой последний вопрос о предметах захвата, также являющихся отрендерено issues Issues
- Я не могу добавить разрыв строки и избежать перерисовки нового рендера поверх предыдущего, а
- Я не могу позиционировать текст, так как addText не принимает позиционные аргументы.
MRE:
import random
from fbs_runtime.application_context.PyQt5 import ApplicationContext
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QPdfWriter, QBrush, QPagedPaintDevice
from PyQt5.QtWidgets import (QDialog, QGraphicsScene,
QGraphicsView, QGridLayout,
QPushButton, QGraphicsEllipseItem)
class gui(QDialog):
def __init__(self, parent=None):
super(gui, self).__init__(parent)
self.resize(1280, 720)
self.painter = QGraphicsScene(0, 0, self.width() - 50, self.height() - 70)
self.painter.setBackgroundBrush(QBrush(Qt.white))
self.canvas = QGraphicsView(self.painter)
mainLayout = QGridLayout()
mainLayout.addWidget(self.canvas, 0, 0, -1, -1)
self.setLayout(mainLayout)
@property
def circleList(self):
return [item for item in self.painter.items() if isinstance(item, QGraphicsEllipseItem)]
def newCircle(self):
self.painter.addEllipse( random.randint(100, 400), random.randint(100, 400), 50 + random.random() * 200, 50 + random.random() * 200)
def generateReport(self):
printed = QPdfWriter("Output.pdf")
printed.setPageSize(QPagedPaintDevice.A4)
printer = QPainter(printed)
self.painter.render(printer)
for i,j in enumerate(self.circleList):
printer.drawText(0, printer.viewport().height() + i*200, 'test')
printer.end()
if __name__ == "__main__":
app = ApplicationContext()
test = gui()
test.newCircle()
test.newCircle()
test.newCircle()
test.generateReport()
test.show()
exit(app.app.exec_())
, если возможно, возможность печатать, тестировать, затем кружить для всех кругов была бы для меня достаточно приличной.
Неправильный пример вывода: