QgarphicsItem は、Qt ビュー システムの項目です。 QGraphicsItem 自体は、マウスのドラッグによるズームをサポートしていません。この記事では、マウス イベントを変更して項目のサイズを変更する方法について説明します。 (この記事で使用している Qt のバージョンは Qt4.8 です)
以下のコードで実装される機能は次のとおりです: Shift キーを押しながらマウスでドラッグすると、ボックスのサイズを変更できます。
class Box:public QGraphicsItem { Q_DECLARE_TR_FUNCTIONS(Box)public: Box(); ...protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); };
Box::Box() { setFlags(QGraphicsItem::ItemIsSelectable| QGraphicsItem::ItemIsMovable| QGraphicsItem::ItemSendsGeometryChanges| QGraphicsItem::ItemIsFocusable); //接受键盘事件 mBoundingRect = QRectF(0,0,100,100); mBoundingRect.translate(-mBoundingRect.center()); }
上記の 2 つのコードは、Box クラスの定義とコンストラクターの実装です。最も重要なことは、Box が実行できるようにするための 3 つのマウス関数のオーバーロードと setFlag です。キーボードイベントを受け入れます。
void Box::mousePressEvent(QGraphicsSceneMouseEvent *event) { if(event->modifiers()&Qt::ShiftModifier) { resizing = true; //resizing变量在鼠标点击时变为true //在放开时变为false setCursor(Qt::SizeAllCursor);//鼠标样式变为十字 } else QGraphicsItem::mousePressEvent(event); }
void Box::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(resizing) { QRectF rect(mBoundingRect); if(event->pos().x()<rect.x()) rect.setBottomLeft(event->pos()); else rect.setBottomRight(event->pos()); mBoundingRect=rect; mBoundingRect.translate(-mBoundingRect.center()); scene()->update(); } else QGraphicsItem::mouseMoveEvent(event); }
ここでは、マウスの位置と一致するようにBoxの左下隅と右上隅を更新するだけです。より良いアプローチは、x 座標と y 座標を別々に処理することです。
void Box::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if(resizing) { resizing = false; setCursor(Qt::ArrowCursor); } else QGraphicsItem::mouseReleaseEvent(event); }
サイズ変更プロセス中にユーザーがマウスを放すと、サイズ変更が true に変更され、マウス スタイルが矢印に戻ります。
以上がQGraphicsItemのスケーリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。