【发布时间】:2020-02-23 08:30:30
【问题描述】:
我有一个带有 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()
j 上的nameItem 是线的名称标签,m_items[4] 是每个圆的名称标签。
我的问题是我似乎无法获得渲染场景的确切高度,此外,如果内容不适合,我如何将文本溢出到下一页的线索为零。
如果我能以某种方式为每个连接分别渲染每一行及其对应的圆圈,那将是很可爱的,存储在 lineList 中
注意:这条线是每个圈子的孩子,每条线和圈子的名字都是他们的孩子,实现方式与我的previous question 的答案大致相同,这就是我最后的握把问题项目也在被渲染。
我发现我可以创建一个新场景,逐个移动每个项目并将其渲染到 pdf 中,但这会引发两个不同的问题
- 我无法添加换行符并避免在前一个渲染上过度绘制新渲染,并且
- 我无法定位文本,因为 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_())
如果可能的话,打印、测试然后圈出所有圈子的能力对我来说已经足够了。
不正确的输出示例:
【问题讨论】:
-
@eyllanesc 您能否看一下我在原始帖子中编辑的输出示例?在此期间,我将尝试提供 MRE
-
这是我的代码,它与您的问题无关,它可能是您项目的一部分,但不是您当前的问题。我建议每次你问一个问题,你说:我想在我的项目中实现 X,尝试 Y,它对我不起作用,那么你必须提供一个 MRE。我理解这个问题,但不是答案取决于你的代码。
-
1) 我知道您正在研究 MRE,但我的建议是针对下一个问题。 2)图像有助于理解问题。 3) 抓取物品的解决方案是微不足道的。 4) 如果您提供 MRE,则不需要图像,因为您可以直接看到问题,从一开始就提供的 MRE 可以为我们节省所有时间。 :-)
-
现在您让我感到困惑,因为 MRE 不会生成您提供的图像,您可以放置一张您想要为 MRE 获取的图像,因为我不清楚。