1

上に描画すると、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

これらのオーバーロード メソッドを見てください。ここでは、テキスト パラメーターの後に Bounding Rectangle を指定する必要があります (これは、最初の引数の位置にある四角形とは明らかに異なります)。

指定されたフラグに従って、指定された長方形内に指定されたテキストを描画します。boundingRect (null でない場合) は、テキスト全体を囲むために外接する四角形がどうあるべきかに設定されます。

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

アップデート:

事前に drawText() メソッドの境界矩形を生成したい場合は、QPainter で boundingRect() メソッドを呼び出すだけで、次のことが行われます。

現在設定されている font(); を使用して、指定されたフラグで指定された長方形の内側に描画されたときに表示される、テキストの境界長方形を返します。つまり、この関数は、同じ引数が与えられたときに drawText() 関数が描画する場所を示します。

指定されたフラグを使用して指定された長方形内にテキストが収まらない場合、関数は必要な長方形を返します。

QPainter.boundingRect

QRectF出力でBoundingRectにリンクしましたが、情報は他のバージョンにも当てはまります。

基本的に、QPainter.boundingRect() の結果を QPainter.drawText() メソッドの boundingRect パラメータ (2 番目の QRect 引数) に渡します。

更新 2:

私は非常に密集していることを心からお詫びします。PyQt と Qt では drawText の動作が異なることを忘れていました。外接する四角形は 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 に答える