drawText()でQPictureの境界四角形を更新する方法はありますか?
質問
に絵を描く 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 がここで私を助けてくれることを願っています。)
解決
これらのオーバーロード メソッドを見てください。テキスト パラメーターの後に境界四角形を指定する必要があります (最初の引数の位置の四角形とは明らかに異なります)。
与えられたテキストを に従った矩形が提供される。 指定されたフラグ。boundingRect(もし not null) が設定される。 バウンディング・レクタングル(境界矩形)の順序 でテキスト全体を囲む。
QPainter.drawText (1), QPainter.drawText (2)
アップデート:
事前にdrawText()メソッドの境界四角形を生成したい場合は、QPainterでboundingRect()メソッドを呼び出すだけで、次のことが行われます。
の外接矩形を返します。 描画時に表示されるテキスト で指定された矩形の内側に 指定されたフラグは、現在 フォントを設定します;つまり、この関数は次のことを教えてくれる。 ここでdrawText()関数は 同じ引数が与えられると、ドローを描く。
テキストが 指定された フラグを返します。 必要な長方形。
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()メソッドの出力によって返されます。
これは理想的な動作とは思えません。外接する四角形を自分で設定する必要があります。他の誰かがあなたが探している答えを持っていることを願っていますが、このバグを報告したいと思うかもしれません。
他のヒント
Qt ではペイントしてもサイズは変わりません。主な理由は次のとおりです。
- コンポーネントはそれ自体をペイントする必要があります
- ペイントによりサイズ変更がトリガーされる
- サイズ変更によりペイントがトリガーされる -> 無限ループ
したがって、サイズ変更はレイアウト段階で行う必要があります。その後、境界は変更されないはずです。
問題を解決するには、QFontMetric を使用して、画像の作成中または作成中にテキストがどのくらいの大きさになるかを把握し、それに応じてサイズを変更します。
[編集] うーん...境界四角形をリクエストする前に end() を呼び出してみてください。それが機能する場合は、バグが見つかったことになります (要素を追加するときに境界四角形が存在してはいけない理由がわかりません...)