2009-04-27 115 views
2

QPicture上绘图应更新其边界矩形。就像这样:有没有办法让drawText()更新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) 

但如果我在上面绘制文本,不更新边界RECT:

>>> 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

您使用的是什么版本的PyQt?在4.3和更高版本中,drawText不是QPicture上的方法。 – 2009-04-27 12:46:10

+0

我的意思是painter.drawText()在那里,对不起。我正在使用Qt 4.4。 (由PyQt支持的最新版本) – 2009-04-27 12:49:22

+0

好的,看我的答案,它可能是你正在寻找的。 – 2009-04-27 12:51:26

回答

3

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

绘制根据 指定的标志设置矩形 内给定的文本。 boundingRect(如果 非空)设置为 边界矩形按顺序 包围整个文本。

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

更新:

,如果你想生成提前为的drawText外接矩形()方法,它的出现,你只需要调用boundingRect()上QPainter的方法,它执行以下操作:

返回 文本的边界矩形,因为它会出现wh在给定矩形内绘制 ,使用 设置字体(); 指定标志。即该函数告诉您 在给定相同参数时drawText()函数将在哪里绘制 。

如果文本中不使用指定的 标志的 定矩形内适合,该函数返回 所需的矩形。

QPainter.boundingRect

我联系与QRectF输出BoundingRect,但信息适用于其他的版本。

所以基本上,将QPainter.boundingRect()的结果传递给QPainter.drawText()方法(第二个QRect参数)的boundingRect参数。

更新2:

我道歉大汗了这么该死的密集。我忘记了DrawText在PyQt中的工作方式与Qt中的不同。边界矩形由drawText函数返回(不像Qt中传入),此外,在返回给定边界矩形之前,必须指定对齐标志。 (I甚至包括在p.end(),按照亚伦Digulla的评论):

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的输出返回给你()方法时,passi在旗帜中。

这看起来不像理想的行为,你必须自己设置边界矩形。我希望别人有你正在寻找的答案,但我怀疑你可能想报告这个错误。

1

绘画不会改变Qt中的东西的大小。主要的原因是这样的:

  • 的组件具有自身油漆
  • 油漆触发调整大小
  • 容量调整触发画 - >无限循环

所以调整大小有期间发生布局阶段。之后,边界不应该改变。

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

[编辑] Hm ...尝试在请求边界矩形之前调用end()。如果这样,你会发现一个bug(看不到添加元素时边界矩不存在的原因)

相关问题