qgraphicsitemを強制してください[重複
-
27-10-2019 - |
質問
この質問にはすでに答えがあります:
私は持っています QGraphicsScene
それはいっぱいです QGraphicsItems
, 、そして、ユーザーはさまざまなものをすべて検査するためにズームしてズームしています QGraphicsItems
. 。しかし、私は持って欲しいです QGraphicsTextItem
常に画面の左上に置かれたままであるラベル。ズームを無視するのは簡単です。 setFlags(QGraphicsItem::ItemIgnoresTransformations)
, 、しかし、私はまだ左上にとどまるように立場を強制する方法を理解していません。同じ場所で「フロート」をラベルにする最良の方法は何ですか?
解決
おそらくあなたはただ常連をしたいだけです QLabel
議論されているように、シーンの一部を1か所に留めようとするのではなく、ビューのすぐ上に この質問.
ノート: 別の答えで述べたように、このトリックはしばしばハードウェアの加速ビューでは機能しません。これらの場合、テキストアイテムをシーンの一部にする必要があります。
他のヒント
それを行う唯一の(リアル可能な)方法は、すべてのフレームのテキストアイテムの位置を再計算することだと思います。これを行うには、単にqgraphicsviewをサブクラス化し、painteventをオーバーライドし、qgraphicsview :: maptoscene()を使用して新しい位置を計算します。何かのようなもの:
void MyGraphicsView::paintEvent(QPaintEvent*)
{
QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
m_textItem->setPos(scenePos);
}
私はこれを何度も何度もやってきましたが、それは非常にうまく機能しています。
もちろん、アーノルド・スペンスが彼の答えで言及しているように、通常のQlabelを作成することもできます。ただし、これは多くの状況では機能しません(たとえば、グラフィックビューの上にラベルを配置したい場合、OpenGL-Accelerated Viewportを使用している場合)。