qgraphicsitemgroup中item如何根据group移动而刷新
1条回答 默认 最新
Gary_HanJR 2023-04-13 20:04关注可以通过重载 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 组添加到场景中,并设置组可以移动的标志位。执行程序后,可以通过拖动图形项组,观察子项的位置更新效果。
评论 打赏 举报解决 1无用