如何使QGraphicsItem的位置依赖于另一个QGraphicsItem?

时间:2016-10-21 19:59:47

标签: c++ qt c++11 qgraphicsscene qgraphicsitem

我想在另一个移动时在QGraphicsItem移动(或更改大小)中制作一个QGraphicsScene。但是,尝试从QGraphicsItem对象访问QGraphicsScene会导致崩溃。

这是一个虚拟的例子。我想自动:

  1. 点击并拖动BlueItem时调整RedItem的宽度。

  2. 点击并拖动RedItem后移动BlueItem

  3. 虚拟代码:

    redItem.h(一个pixmap项目)

    #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类似于redItem.cpp

    graphicsViewWidget.h(The GraphicsView)

    #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;
    
    }
    

    非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:3)

如果你将项目B作为项目A的子项,那么它将存在于其坐标空间中。这意味着所有变换 - 移动,缩放,旋转......您应用于父项的所有内容也将应用于其所有子项及其子项等等.​​..