weixin_43252831 2023-04-13 16:20 采纳率: 0%
浏览 10

qgraphicsitemgroup中item根据group刷新

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

    评论

报告相同问题?

问题事件

  • 创建了问题 4月13日