Qt c++用QGraphicsItem类实现拖动一个矩形图形时 出现一个虚线矩形来代表拖动位置 原矩形位置不动 鼠标松开后原矩形移动到拖动位置 虚线矩形消失
时间: 2024-03-28 13:42:10 浏览: 78
好的,这是一个常见的需求,下面是实现的基本步骤:
1. 创建一个自定义的 QGraphicsItem 类,重写其 `boundingRect()` 和 `paint()` 方法,分别用于确定图形所占的矩形区域和绘制图形。
2. 在重写的 `mousePressEvent()` 方法中,记录下鼠标按下时的位置,并设置 `setCursor(Qt::ClosedHandCursor)` 来改变鼠标形状。
3. 在重写的 `mouseMoveEvent()` 方法中,计算鼠标移动的距离,并根据该距离在场景中创建一个虚线矩形图形,该图形用于表示拖动的位置。同时,设置 `setCursor(Qt::ClosedHandCursor)` 来改变鼠标形状。
4. 在重写的 `mouseReleaseEvent()` 方法中,移动原矩形到虚线矩形的位置,并删除虚线矩形图形。同时,设置 `setCursor(Qt::ArrowCursor)` 来还原鼠标形状。
下面是一个简单的示例代码,可以参考一下:
```cpp
class MyRectItem : public QGraphicsItem
{
public:
MyRectItem(QGraphicsItem *parent = nullptr)
: QGraphicsItem(parent)
{
setFlags(ItemIsMovable | ItemSendsGeometryChanges);
}
QRectF boundingRect() const override
{
return QRectF(-50, -50, 100, 100);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
{
painter->setBrush(Qt::red);
painter->drawRect(boundingRect());
}
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
m_lastPos = event->pos();
setCursor(Qt::ClosedHandCursor);
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->buttons() & Qt::LeftButton)
{
QPointF delta = event->pos() - m_lastPos;
m_lastPos = event->pos();
QGraphicsRectItem *guideRect = new QGraphicsRectItem(boundingRect(), this);
guideRect->setPen(QPen(Qt::DashLine));
guideRect->setBrush(Qt::NoBrush);
guideRect->setPos(pos() + delta);
setCursor(Qt::ClosedHandCursor);
}
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
QGraphicsItem *item = scene()->itemAt(event->scenePos(), QTransform());
if (item && item->parentItem() == this)
{
setPos(item->pos());
}
QList<QGraphicsItem *> itemList = scene()->items(event->scenePos());
for (QGraphicsItem *item : itemList)
{
if (item->parentItem() == this)
{
delete item;
}
}
setCursor(Qt::ArrowCursor);
}
}
private:
QPointF m_lastPos;
};
```
在这个示例代码中,我们创建了一个名为 `MyRectItem` 的自定义图形项,该项继承自 `QGraphicsItem` 类。在该类中,我们重写了 `boundingRect()` 和 `paint()` 方法来确定图形所占的矩形区域和绘制图形。同时,我们还重写了 `mousePressEvent()`、`mouseMoveEvent()` 和 `mouseReleaseEvent()` 方法来实现拖动和虚线矩形的绘制和删除。
阅读全文