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

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

  • 单击并拖动BlueItem时,调整RedItem的宽度。
  • 单击并拖动RedItem时移动BlueItem

  • 伪代码:

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

    任何帮助或建议,将不胜感激。

    最佳答案

    如果将项目B设为项目A的子项,则它将位于其坐标空间中。这意味着所有转换-移动,缩放,旋转...应用于父项的所有内容也将应用于其所有子项及其子项,依此类推...

    09-09 18:55