qgraphicsitemgroup中item根据group刷新

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 组添加到场景中,并设置组可以移动的标志位。执行程序后,可以通过拖动图形项组,观察子项的位置更新效果。