3

かなり小さなポイントマーカーを持つ QGraphicsScene があります。ドラッグしやすくするために、これらのマーカーの領域を拡大したいと思います。マーカーは十字で、原点から +/- 2 ピクセルです。再実装しました

QGraphicsItem::contains(const QPointF & point ) const
{
  return QRectF(-10,-10,20,20);
}

void hoverEnterEvent(QGraphicsSceneHoverEvent* event)
{
  setPen(QPen(Qt::red));
  update();
}

ただし、マーカーはカーソルが直接当たったときにのみ赤くなります(それも少しうるさいです)。「ホバー領域」を拡大するにはどうすればよいですか?

4

1 に答える 1

5

短いコメントで述べたように: 通常、これらはバウンディング rect または shape 関数を介して処理されます。それらをオーバーロードしてみてください。シェイプの下の QGraphicsItem の qt ヘルプを見てください ( http://doc.qt.io/qt-4.8/qgraphicsitem.html#shape ):

このアイテムの形状をローカル座標の QPainterPath として返します。形状は、衝突検出、ヒット テスト、QGraphicsScene::items() 関数など、多くのことに使用されます。

デフォルトの実装では、boundingRect() を呼び出して単純な長方形の形状を返しますが、サブクラスはこの関数を再実装して、長方形以外のアイテムのより正確な形状を返すことができます。たとえば、丸いアイテムは、より良い衝突検出のために楕円形を返すことを選択する場合があります。例えば:

QPainterPath RoundItem::shape() const { QPainterPath パス; path.addEllipse(boundingRect()); 復路; シェイプのアウトラインは、描画時に使用するペンの幅とスタイルによって異なります。このアウトラインをアイテムのシェイプに含めたい場合は、QPainterPathStroker を使用してストロークからシェイプを作成できます。

この関数は、contains() および collidesWithPath() のデフォルトの実装によって呼び出されます。

したがって、基本的には、アイテムに関連付けられている「ゾーン」にアクセスするすべての関数が形状を呼び出し、結果として得られるペインタ パスを使用して包含または衝突の検出などを行うということです。したがって、小さなアイテムがある場合は、シェイプ ゾーンを拡大する必要があります。たとえば、シェイプの実装が次のようになるよりも、ターゲットである線を考えてみましょう。

QPainterPath Segment::shape() const{
  QLineF temp(qLineF(scaled(Plotable::cScaleFactor)));
  QPolygonF poly;
  temp.translate(0,pen.widthF()/2.0);
  poly.push_back(temp.p1());
  poly.push_back(temp.p2());
  temp.translate(0,-pen.widthF());
  poly.push_back(temp.p2());
  poly.push_back(temp.p1());
  QPainterPath path;
  path.addPolygon(poly);
  return path;
}

ペンはセグメントのメンバーであり、その幅を使用してシェイプ ゾーンを拡大します。ただし、オブジェクトの実際の寸法との関係が良好な他のものを使用することもできます。

于 2012-12-02T18:40:01.140 に答える