1

基本的に、グラフィックビューをクリックするたびに、新しい QGraphicsEllipseItem を表示したいと思います。数はユーザー次第です。また、すべての位置を取得するために、最後に pos() を使用してそれらすべてにクエリを実行したいと思います。楕円の数は事前にはわかりませんが、それらの位置は ItemIsMovable フラグによって移動できます。どうすればこれができるか知っている人はいますか?

グラフィックアイテム クラスへのポインターの配列を作成することもできますが、メモリを浪費し、作成できる楕円の数が制限される可能性があります。ありがとう。

4

1 に答える 1

2

シーンに好きなだけ項目を追加できます (もちろん、空きメモリ領域がある限り):

myGraphicsScene->addEllipse(rect, pen, brush);

クリックごとにアイテムを追加するには、 の を再実装しmousePressEventますQGraphicsView

void MyGraphicsView::mousePressEvent(QMouseEvent *e)
{
    int rx = 10; // radius of the ellipse
    int ry = 20;
    QRect rect(e->x() - rx, e->y() - ry, 2*rx, 2*ry);
    scene()->addEllipse(rect, pen, brush);

    // call the mousePressEvent of the super class:
    QGraphicsView::mousePressEvent(e);
}

自分でポインタを保存する必要はありません。シーン内のすべてのアイテムの一部の情報を照会する場合は、シーンによって提供されるアイテムのリストをループするだけです。

foreach(QGraphicsItem *item, myGraphicsScene->items())
    qDebug() << "Item geometry =" << item->boundingRect();

(またはポジションのみ: item->pos())

のサブクラスの情報を照会する場合はQGraphicsItem、Qt の QGraphicsItem キャスト メカニズムを使用して項目を自分の型にキャストできます。このメカニズムは、項目が要求された型でない場合に null ポインターを返します。ポインターが null でないことを確認したら、独自のメンバーにアクセスできます。

foreach(QGraphicsItem *item, myGraphicsScene->items())
{
    MyDerivedItem *derivedItem = qgraphicsitem_cast<MyDerivedItem*>(item);
    if(derivedItem) // check success of QGraphicsItem cast
        qDebug() << derivedItem->yourCustomMethod();
}
于 2012-05-23T22:38:21.653 に答える