qt 绘制一个边线可以拖拽的矩形

在 Qt 中绘制一个边线可以拖拽的矩形,可以通过使用 QGraphicsView 和 QGraphicsScene 来实现。QGraphicsView 提供了一个视图窗口,QGraphicsScene 用于管理所有的图形项,比如矩形。我们可以使用 QGraphicsRectItem 来表示矩形,并通过鼠标事件来实现拖拽功能。

以下是一个简单的示例代码,展示如何实现一个可以拖拽边线的矩形:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QMouseEvent>
#include <QDebug>

class DraggableRectItem : public QGraphicsRectItem {
public:
    DraggableRectItem(QRectF rect) : QGraphicsRectItem(rect) {
        setFlags(ItemIsMovable | ItemSendsGeometryChanges);
    }

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event) override {
        if (event->button() == Qt::LeftButton) {
            m_dragStartPoint = event->pos();
        }
        QGraphicsRectItem::mousePressEvent(event);
    }

    void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {
        if (event->buttons() & Qt::LeftButton) {
            QPointF newPos = pos() + event->pos() - m_dragStartPoint;
            setPos(newPos);
            m_dragStartPoint = event->pos();
        }
        QGraphicsRectItem::mouseMoveEvent(event);
    }

private:
    QPointF m_dragStartPoint;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建场景
    QGraphicsScene scene;

    // 创建一个可拖拽的矩形
    QRectF rect(0, 0, 100, 100);
    DraggableRectItem *rectItem = new DraggableRectItem(rect);
    scene.addItem(rectItem);

    // 创建视图
    QGraphicsView view(&scene);
    view.setRenderHint(QPainter::Antialiasing);
    view.setSceneRect(0, 0, 400, 300);
    view.show();

    return app.exec();
}

代码解释

  1. DraggableRectItem 类:
    • 继承自 QGraphicsRectItem
    • 在构造函数中,设置标志 ItemIsMovable 使得矩形可以被移动,ItemSendsGeometryChanges 使得在矩形的几何变换发生变化时可以接收通知。
    • 重写 mousePressEvent 和 mouseMoveEvent 方法,以实现自定义的拖拽行为。
  2. main 函数:
    • 创建 QApplication 对象。
    • 创建 QGraphicsScene 对象来管理图形项。
    • 创建一个 DraggableRectItem 对象,并将其添加到场景中。
    • 创建 QGraphicsView 对象来显示场景,并设置视图的大小。
    • 调用 show 方法显示视图。

运行这个程序,你会看到一个可以拖拽的矩形。你可以点击并拖动矩形的任意位置来移动它。

这个示例是一个基本的实现,如果你需要更复杂的拖拽行为(比如只拖拽边线来调整矩形大小),你需要进一步处理鼠标事件,并根据需要调整矩形的尺寸。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值