如何使 QGraphicsItem 的位置依赖于另一个 QGraphicsItem?
How to make a QGraphicsItem's position dependent on another QGraphicsItem?
我想 QGraphicsItem
在 QGraphicsScene
移动(或改变大小)时另一个移动。但是,尝试从 QGraphicsScene
对象访问 QGraphicsItem
会导致崩溃。
这是一个虚拟示例。我想自动:
单击并拖动 RedItem
时调整 BlueItem
的宽度。
当我点击并拖动BlueItem
时移动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 类似于 redItem.cpp
graphicsViewWidget.h(图形视图)
#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 的子项,那么它将位于其坐标 space 中。这意味着所有变换 - 移动、缩放、旋转...您应用于父项的所有内容也将应用于其所有子项及其子项等等...
我想 QGraphicsItem
在 QGraphicsScene
移动(或改变大小)时另一个移动。但是,尝试从 QGraphicsScene
对象访问 QGraphicsItem
会导致崩溃。
这是一个虚拟示例。我想自动:
单击并拖动
RedItem
时调整BlueItem
的宽度。当我点击并拖动
BlueItem
时移动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 类似于 redItem.cpp
graphicsViewWidget.h(图形视图)
#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 的子项,那么它将位于其坐标 space 中。这意味着所有变换 - 移动、缩放、旋转...您应用于父项的所有内容也将应用于其所有子项及其子项等等...