有没有办法让drawText()更新QPicture的边界矩形?

时间:2009-04-27 07:29:39

标签: qt pyqt

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可以在这里帮助我。)

2 个答案:

答案 0 :(得分:3)

看看这些重载方法,你必须在text参数之后指定Bounding Rectangle(它明显不同于第一个参数位置的矩形):

  

在...中绘制给定的文本   根据提供的矩形   指定的标志。 boundingRect(如果   not null)设置为什么   边界矩形应该是有序的   附上整篇文章。

QPainter.drawText (1)QPainter.drawText (2)

<强>更新

如果你想提前为drawText()方法生成一个边界矩形,你只需要在QPainter上调用boundingRect()方法,它执行以下操作:

  

返回的边界矩形   绘制时会出现的文字   在给定的矩形内   使用当前的指定标志   set font();即功能告诉你   drawText()函数将在哪里   在给出相同的论点时绘制。

     

如果文字不适合   使用指定的给定矩形   flags,函数返回   所需的矩形。

QPainter.boundingRect

我使用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中某些东西的大小。主要原因是:

  • 组件必须自行绘画
  • 画颜会触发调整大小
  • 调整大小触发绘画 - &gt;无尽的循环

因此调整大小必须在布局阶段进行。在那之后,界限不应该改变。

要解决您的问题,请使用QFontMetric计算您的图片在构建图片期间或接近图片的大小,然后相应地调整其大小。

[EDIT] Hm ...尝试在请求边界矩形之前调用end()。如果可以,你发现了一个错误(当你添加元素时,无法看到为什么边界矩形不应该存在的原因......)