2016-10-21 22 views
1

QGraphicsSceneに別のものが動いたらQGraphicsItemを移動(またはサイズ変更)したいと思います。しかし、QGraphicsSceneオブジェクトからQGraphicsItemにアクセスしようとすると、クラッシュすることがあります。QGraphicsItemの位置を別のQGraphicsItemに依存させる方法は?

ここにはダミーの例があります。私はクリックしてドラッグRedItemとき

  1. リサイズBlueItemの幅:私は、自動的にしたいです。

  2. をクリックしてドラッグすると、RedItemが移動します。

ダミーコード:

redItem.h(ピックスマップアイテム)

#include <QGraphicsPixmapItem> 

class RedItem : public QGraphicsPixmapItem 
{ 
public: 
    RedItem(); 

protected: 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 
}; 

redItem.cpp

RedItem::RedItem() 
{ 
    setPixmap(QPixmap(redPixMap)); 
    setFlags(ItemIsMovable); 
    setCacheMode(DeviceCoordinateCache); 
} 

void RedItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) 
{ 
    setPos(event->scenePos(),0); //I can override this part just fine. 
} 

blueItem.h(サイズ変更可能な長方形アイテム)

#include <QGraphicsRectItem> 

class BlueItem : public QGraphicsRectItem 
{ 
public: 
    BlueItem(); 

protected: 
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event); 
}; 

blueItem.cppは

#include <QGraphicsView> 
#include "blueItem.h" 
#include "redItem.h" 


class GraphicsViewWidget : public QGraphicsView 
{ 
    Q_OBJECT 
public: 
    explicit GraphicsViewWidget(QWidget *parent = 0); 

protected: 
    virtual void mouseMoveEvent(QMouseEvent *event); 

private: 
    RedItem *red; 
    BlueItem *blue; 
}; 

graphicsViewWidget.cpp

#include "graphicsViewWidget.h" 
#include <QRectF> 

void Qx::createItem(int frame) 
{ 

    red = new RedItem; 
    red->setPos(0, 0); 
    scene()->addItem(red); 


    blue = new BlueItem; 
    blue->setPos(10, 10); 
    scene()->addItem(blue); 
} 

void GraphicsViewWidget::mouseMoveEvent(QMouseEvent *event) //QGraphicsSceneMouseEvent 
{ 
    QGraphicsView::mouseMoveEvent(event); 

    //if(redItem moves) 
    // resize blueItem; 

    //if(blueItem moves) 
    // move redItem; 

} 

任意のヘルプやアドバイスをいただければ幸いredItem.cpp

graphicsViewWidget.h(GraphicsView)と同様です。

答えて

3

アイテムBをアイテムAの子にすると、そのアイテムは座標空間に存在します。これは、移動、スケーリング、回転などのすべての変換を意味します。親アイテムに適用するすべてのものは、すべての子どもとその子供などにも適用されます。

+0

面白い!私は印象のアイテムの下にあったのは、シーン内でのみ作成できるということでした。つまり、アイテムAのコンストラクタでアイテムBを初期化するということですか? –

+1

オンまたはオフのシーンであるシーンまたは他の既存のアイテムにアイテムを追加できます。親を渡すコンストラクタ、または 'setParentItem()'関数を使うことができます。親がすでにシーンに追加されている場合、新しいオブジェクトも自動的に追加されます。 – dtech

+0

この例のリンクはありますか? –

関連する問題