在QPicture
上绘图应该更新其边界矩形。像这样:
>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawRect(20,20,50,50)
>>> picture.boundingRect()
QRect(20,20,50,50)
但如果我在上面绘制文字,则不会更新边界矩形:
>>> picture = QPicture()
>>> painter = QPainter(picture)
>>> picture.boundingRect()
QRect(0,0,0,0)
>>> painter.drawText(10,10, "Hello, World!")
>>> picture.boundingRect()
QRect(0,0,0,0)
显然,它不会更新边界矩形。
有没有办法让它重新删除绘制的文本或我必须手动执行? (不太难,但我希望Qt可以在这里帮助我。)
答案 0 :(得分:3)
看看这些重载方法,你必须在text参数之后指定Bounding Rectangle(它明显不同于第一个参数位置的矩形):
在...中绘制给定的文本 根据提供的矩形 指定的标志。 boundingRect(如果 not null)设置为什么 边界矩形应该是有序的 附上整篇文章。
QPainter.drawText (1),QPainter.drawText (2)
<强>更新强>
如果你想提前为drawText()方法生成一个边界矩形,你只需要在QPainter上调用boundingRect()方法,它执行以下操作:
返回的边界矩形 绘制时会出现的文字 在给定的矩形内 使用当前的指定标志 set font();即功能告诉你 drawText()函数将在哪里 在给出相同的论点时绘制。
如果文字不适合 使用指定的给定矩形 flags,函数返回 所需的矩形。
我使用QRectF输出链接到BoundingRect,但该信息也适用于其他版本。
基本上,将QPainter.boundingRect()的结果传递给QPainter.drawText()方法的boundingRect参数(第二个QRect参数)。
更新2:
我很容易因为这么该死。我忘了drawText在PyQt中的工作方式与在Qt中的工作方式不同。边界矩形由drawText函数返回(不像Qt一样传入),此外,在得到给你的边界矩形之前,你必须指定对齐标志。 (根据Aaron Digulla的评论,我甚至包括了p.end()):
pic = Qt.QPicture()
p = QtGui.QPainter(pic)
brect = p.drawText(10,10,200,200, QtCore.Qt.AlignCenter, "blah")
p.end()
print brect
print pic.boundingRect()
这是输出:
PyQt4.QtCore.QRect(100,103,20,14)
PyQt4.QtCore.QRect(0,0,0,0)
所以看来你必须自己设置边界矩形,不过至少它在传入标志时由drawText()方法的输出返回给你。
这似乎不是理想的行为,您必须自己设置边界矩形。我希望其他人有你想要的答案,但我怀疑你可能想报告这个错误。
答案 1 :(得分:1)
绘画不会改变Qt中某些东西的大小。主要原因是:
因此调整大小必须在布局阶段进行。在那之后,界限不应该改变。
要解决您的问题,请使用QFontMetric计算您的图片在构建图片期间或接近图片的大小,然后相应地调整其大小。
[EDIT] Hm ...尝试在请求边界矩形之前调用end()。如果可以,你发现了一个错误(当你添加元素时,无法看到为什么边界矩形不应该存在的原因......)