にQGraphicsTextItem
オブジェクトがありQGraphicsScene
ます。ユーザーはQGraphicsTextItem
、角をドラッグしてオブジェクトを拡大縮小できます。(これを行うために、カスタムの「変換エディター」を使用しています。) ユーザーはQGraphicsTextItem
、プロパティ パネルからフォント サイズを変更して、のサイズを変更することもできます。私がやりたいのは、これらを統合して、ユーザーがマウスで角をドラッグしてオブジェクトをスケーリングすると、実際に舞台裏で「結果のオブジェクトをターゲットサイズに合わせて維持するために必要なサイズのフォント」を計算することです倍率は 1.0 ですか?"
私が今行っているのは、オブジェクトを通常どおりにスケーリングし、マウスのスケーリングが完了したらメソッドをQGraphicsItem::mouseMoveEvent
トリガーすることです。次に、このメソッドはフォントを適切なサイズに変更し、スケールを 1.0 に戻します。FinalizeMapScale
QGraphicsItem::mouseReleaseEvent
機能しているように見える解決策がありますが、私はそれに夢中ではありません。私は Qt と C++ の両方に比較的慣れていないので、コメントや修正をいただければ幸いです。
- この全体を設計するためのより良い方法はありますか?
- すでにこれを行っている Qt メソッドはありますか?
- メソッドは正しい軌道に乗っていますが、Qt または C++ エラーがありますか?
以下の私の回答にコメントして、お好みのソリューションを送信してください。ありがとう!
[編集]コメントで要求されているように、スケーリング コードの基本は次のとおりです。実際にはこれで別の方向に進んだため、このコード (および以下のコード) は使用されなくなりました。このコードはメソッド内にあり、マウスが右下の「ホット スポット」でクリックされた場合に、mouseMoveEvent
以前に「scaling_」フラグを true に設定しています。mousePressEvent
このコードは、スケーリングしているターゲットへのポインターを保持するデコレーター QGraphicsItem にあることに注意してください。この抽象化は私たちのプロジェクトには必要でしたが、おそらくほとんどの用途ではやり過ぎです。
void TransformDecorator::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
...
if (scaling_) {
QGraphicsItem *target_item = target_->AsQGraphicsItem();
target_item->setTransformOriginPoint(0.0, 0.0);
QPointF origin_scene = mapToScene(target_item->transformOriginPoint());
QPointF scale_position_scene = mapToScene(event->pos());
qreal unscaled_width = target_item->boundingRect().width();
qreal scale_x = (scale_position_scene.x() - origin_scene.x()) / unscaled_width;
if (scale_x * unscaled_width < kMinimumSize) {
scale_x = kMinimumSize / unscaled_width;
}
target_item->setScale(scale_x);
} else {
QGraphicsObject::mouseMoveEvent(event);
}
}