这个类的使用效果不理想,想的是将鼠标在矩形内部时可以拖动整个矩形移动,在矩形边缘时可以改变矩形大小
时间: 2024-04-15 21:28:21 浏览: 29
如果您想要实现在矩形内部拖动整个矩形移动,在矩形边缘改变矩形大小的效果,可以对GraphicsItem类进行以下修改:
```cpp
#pragma once
#include <QGraphicsItem>
#include <QGraphicsRectItem>
#include <QGraphicsSceneMouseEvent>
class GraphicsItem : public QGraphicsRectItem
{
public:
GraphicsItem(QGraphicsItem* parent = nullptr);
protected:
void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
private:
QPointF m_pressPos;
QRectF m_originalRect;
bool m_bMoving;
bool m_bResizing;
};
```
在这个修改过的类中,我们添加了一个新的成员变量m_bMoving,用于判断是否处于移动状态。
```cpp
#include "GraphicsItem.h"
GraphicsItem::GraphicsItem(QGraphicsItem* parent)
: QGraphicsRectItem(parent)
{
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
m_bMoving = false;
m_bResizing = false;
}
void GraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
m_pressPos = event->pos();
m_originalRect = rect();
if (m_originalRect.contains(m_pressPos))
{
m_bMoving = true;
setCursor(Qt::OpenHandCursor);
}
else if (m_originalRect.adjusted(-5, -5, 5, 5).contains(m_pressPos))
{
m_bResizing = true;
setCursor(Qt::SizeFDiagCursor);
}
QGraphicsRectItem::mousePressEvent(event);
}
void GraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
if (m_bMoving)
{
QPointF delta = event->pos() - m_pressPos;
moveBy(delta.x(), delta.y());
}
else if (m_bResizing)
{
QPointF delta = event->pos() - m_pressPos;
QRectF newRect = m_originalRect.adjusted(0, 0, delta.x(), delta.y());
setRect(newRect);
}
else
{
QGraphicsRectItem::mouseMoveEvent(event);
}
}
void GraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
m_bMoving = false;
m_bResizing = false;
setCursor(Qt::ArrowCursor);
QGraphicsRectItem::mouseReleaseEvent(event);
}
```
在这些修改后的鼠标事件处理函数中,我们根据鼠标操作来更新矩形的位置和大小。如果按下鼠标时位于矩形内部,我们将启用移动功能,并将光标设置为OpenHandCursor,表示可以移动。如果按下鼠标时位于矩形边缘区域(在这里我们选择了一个扩展了5像素的区域),我们将启用改变大小功能,并将光标设置为SizeFDiagCursor,表示可以改变大小。在拖动鼠标时,我们根据鼠标的偏移量来调整矩形的位置或大小。
现在,您可以使用修改后的GraphicsItem类来创建具有拖动和改变大小功能的矩形对象了。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)