1

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

4

2 回答 2

3

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

根据指定的标志在提供的矩形内绘制给定的文本。boundingRect(如果不为空)设置为边界矩形应该是什么,以便包含整个文本。

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

更新:

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

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

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

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() 方法的输出返回给您。

这似乎不是理想的行为,您必须自己设置边界矩形。我希望其他人有你正在寻找的答案,但我怀疑你可能想报告这个错误。

于 2009-04-27T12:51:02.023 回答
1

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

  • 组件必须自己绘制
  • 油漆触发调整大小
  • 调整大小触发绘画 -> 无限循环

所以调整大小必须在布局阶段进行。之后,界限不应改变。

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

[编辑] 嗯 ...在请求边界矩形之前尝试调用 end() 。如果可行,则您发现了一个错误(在添加元素时看不到边界矩形不应该存在的原因......)

于 2009-04-27T07:43:00.673 回答