Qt c++用QGraphicsItem类实现拖动一个矩形图形时 出现一个虚线矩形来代表拖动位置 鼠标松开后矩形移动到拖动位置 虚线矩形消失
时间: 2024-03-28 17:42:03 浏览: 108
Qt鼠标拖动绘制基本几何图形(直线、矩形、圆形、椭圆)
5星 · 资源好评率100%
要实现这个功能,你需要在继承自QGraphicsItem的自定义图形项中重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个事件。
在mousePressEvent中,你需要记录下鼠标点击时的位置和当前图形项的位置,然后将图形项的状态设置为正在被拖动。
在mouseMoveEvent中,你需要根据鼠标移动的距离计算出图形项应该移动的位置,并在图形项上绘制一个虚线矩形,表示拖动位置。
在mouseReleaseEvent中,你需要将图形项的状态设置为已经停止拖动,并将图形项移动到拖动位置,同时让虚线矩形消失。
下面是一个简单的示例代码,可以帮助你理解这个过程:
```
class MyRectItem : public QGraphicsItem
{
public:
MyRectItem(QGraphicsItem *parent = nullptr);
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
private:
QPointF m_pressPos;
QPointF m_itemPos;
bool m_isDragging;
};
MyRectItem::MyRectItem(QGraphicsItem *parent)
: QGraphicsItem(parent)
, m_isDragging(false)
{
}
QRectF MyRectItem::boundingRect() const
{
return QRectF(0, 0, 50, 50);
}
void MyRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
if (m_isDragging) {
// 绘制虚线矩形
painter->setPen(Qt::DashLine);
painter->drawRect(QRectF(m_itemPos, boundingRect().size()));
}
else {
// 绘制实线矩形
painter->setPen(Qt::SolidLine);
painter->drawRect(boundingRect());
}
}
void MyRectItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_pressPos = event->scenePos();
m_itemPos = pos();
m_isDragging = true;
update();
}
else {
QGraphicsItem::mousePressEvent(event);
}
}
void MyRectItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if (m_isDragging) {
QPointF delta = event->scenePos() - m_pressPos;
setPos(m_itemPos + delta);
update();
}
else {
QGraphicsItem::mouseMoveEvent(event);
}
}
void MyRectItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
m_isDragging = false;
update();
}
else {
QGraphicsItem::mouseReleaseEvent(event);
}
}
```
阅读全文