qgraphicsitemgroup中item如何根据group移动而刷新
可以通过重载 QGraphicsItemGroup::mouseMoveEvent 函数,在每次鼠标移动时重新计算图形项的位置,然后使用 QGraphicsItem::setPos 函数将位置更新。这样,当 QGraphicsItemGroup 移动时,包含在其中的图形项也会跟着移动。
// 自定义图形项类
class CustomItem : public QGraphicsItem {
public:
CustomItem(int x, int y) : x_(x), y_(y) {}
QRectF boundingRect() const override {
return QRectF(x_ - 10, y_ - 10, 20, 20);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override {
painter->setPen(Qt::black);
painter->setBrush(Qt::red);
painter->drawEllipse(x_ - 10, y_ - 10, 20, 20);
}
private:
int x_, y_;
};
// 自定义图形项组类
class CustomItemGroup : public QGraphicsItemGroup {
public:
void addCustomItem(int x, int y) {
auto item = new CustomItem(x, y);
addToGroup(item);
items_.append(item);
}
void adjustItems() { // 根据组的位置调整子项位置
foreach(auto item, items_) { // 遍历子项
QPointF pos = item->pos();
item->setPos(pos + pos_); // 更新子项位置
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
QPointF delta = event->scenePos() - event->lastScenePos();
pos_ += delta; // 更新组位置
setPos(pos_);
adjustItems(); // 调整子项位置
}
QGraphicsItemGroup::mouseMoveEvent(event);
}
private:
QList<QGraphicsItem*> items_;
QPointF pos_;
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
view.show();
auto group = new CustomItemGroup();
group->addCustomItem(50, 50);
group->addCustomItem(100, 100);
group->setFlags(QGraphicsItem::ItemIsMovable);
group->setPos(200, 200);
scene.addItem(group);
return a.exec();
}
在上面的示例代码中,自定义的图形项类为 CustomItem,它表示圆形的图形项。自定义的图形项组类为 CustomItemGroup,其中包含由多个 CustomItem 组成的图形项组。在 CustomItemGroup 的 mouseMoveEvent 函数中实现了从组位置计算子项位置的更新逻辑。在主函数中,将 CustomItemGroup 组添加到场景中,并设置组可以移动的标志位。执行程序后,可以通过拖动图形项组,观察子项的位置更新效果。