要实现一个QGraphicsItem移动时,另一个QGraphicsItem也跟随移动,可以使用QGraphicsItemGroup或者自定义的场景管理器来管理这两个图形项。
使用QGraphicsItemGroup:
- 创建两个QGraphicsItem对象。
- 将它们添加到一个QGraphicsItemGroup对象中。
- 在需要移动的时候,通过设置QGraphicsItemGroup对象的位置来实现移动。这将自动影响组内所有的图形项。
示例代码如下:
// 创建场景和视图
QGraphicsScene scene;
QGraphicsView view(&scene);
// 创建两个图形项
QGraphicsEllipseItem* item1 = new QGraphicsEllipseItem(QRectF(0, 0, 50, 50));
QGraphicsRectItem* item2 = new QGraphicsRectItem(QRectF(0, 0, 100, 100));
// 将图形项添加到组中
QGraphicsItemGroup group;
group.addToGroup(item1);
group.addToGroup(item2);
// 设置组的位置
group.setPos(100, 100);
// 添加组到场景中
scene.addItem(&group);
// 移动组(同时移动其中的图形项)
group.setPos(200, 200);
使用自定义的场景管理器:
如果你想更加灵活地控制图形项之间的关系,可以创建一个自定义的场景管理器,并在其advance()
函数中实现需要的行为。你可以在每一帧更新图形项之间的位置关系。
示例代码如下:
class MySceneManager : public QGraphicsScene
{
public:
void advance(int phase) override
{
if (phase == 1)
{
// 在这里更新图形项之间的位置关系
item2->setPos(item1->pos().x() + 50, item1->pos().y());
}
QGraphicsScene::advance(phase);
}
private:
QGraphicsEllipseItem* item1;
QGraphicsRectItem* item2;
};
// 创建场景和视图
MySceneManager scene;
QGraphicsView view(&scene);
// 创建两个图形项
scene.item1 = new QGraphicsEllipseItem(QRectF(0, 0, 50, 50));
scene.item2 = new QGraphicsRectItem(QRectF(0, 0, 100, 100));
// 添加图形项到场景中
scene.addItem(scene.item1);
scene.addItem(scene.item2);
// 设置图形项初始位置
scene.item1->setPos(100, 100);
scene.item2->setPos(150, 100);
// 开启场景的更新机制
scene.startTimer(16); // 每隔16毫秒刷新一次(约60帧/秒)
以上是两种常用的方法,你可以根据实际情况选择适合的方式来管理多个图形项之间的移动。
内容由零声教学AI助手提供,问题来源于学员提问