qt 绘图 实现鼠标拖拽放大缩小矩形 细节1:鼠标在矩形不同位置鼠标不同提示 细节2:可多次添加,多个之间区分不同层 代码
时间: 2023-06-17 15:03:50 浏览: 742
以下是一个简单的示例代码,实现了鼠标拖拽放大缩小矩形,并且考虑了鼠标在不同位置时的提示信息,以及多次添加矩形的情况。代码基于Qt的QWidget进行绘制。
```cpp
#include <QtWidgets>
class RectItem : public QGraphicsItem
{
public:
RectItem(const QRectF& rect, int layerIndex, QGraphicsItem* parent = nullptr)
: QGraphicsItem(parent), m_rect(rect), m_layerIndex(layerIndex)
{
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemIsMovable, true);
setAcceptHoverEvents(true);
setToolTip(QString("Layer %1").arg(m_layerIndex));
}
QRectF boundingRect() const override
{
return m_rect;
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override
{
Q_UNUSED(option);
Q_UNUSED(widget);
painter->drawRect(m_rect);
}
private:
QRectF m_rect;
int m_layerIndex;
};
class GraphicsView : public QGraphicsView
{
public:
GraphicsView(QWidget* parent = nullptr)
: QGraphicsView(parent)
{
setRenderHint(QPainter::Antialiasing);
setDragMode(QGraphicsView::RubberBandDrag);
}
protected:
void mousePressEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
m_lastPos = event->pos();
m_rectItem = nullptr;
}
QGraphicsView::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent* event) override
{
if (event->buttons() & Qt::LeftButton)
{
if (!m_rectItem)
{
m_rectItem = new RectItem(QRectF(m_lastPos, event->pos()), m_layerIndex++, scene()->foregroundBrush().color(), scene()->foregroundBrush().color().darker(150), scene());
m_rectItem->setToolTip(QString("Layer %1\nDrag to move\nShift+drag to resize").arg(m_rectItem->data(Qt::UserRole).toInt()));
}
else
{
QRectF rect = QRectF(m_lastPos, event->pos()).normalized();
m_rectItem->setRect(rect);
}
}
else
{
QGraphicsItem* item = scene()->itemAt(mapToScene(event->pos()), QTransform::fromScale(1, 1));
if (item && item->type() == QGraphicsItem::UserType + 1)
{
setCursor(Qt::SizeAllCursor);
}
else
{
setCursor(Qt::ArrowCursor);
}
}
QGraphicsView::mouseMoveEvent(event);
}
void mouseReleaseEvent(QMouseEvent* event) override
{
if (event->button() == Qt::LeftButton && m_rectItem)
{
if (m_rectItem->rect().width() < 10 || m_rectItem->rect().height() < 10)
{
delete m_rectItem;
}
else
{
m_rectItem->setSelected(true);
}
m_rectItem = nullptr;
}
QGraphicsView::mouseReleaseEvent(event);
}
void keyPressEvent(QKeyEvent* event) override
{
if (event->key() == Qt::Key_Delete)
{
foreach(QGraphicsItem* item, scene()->selectedItems())
{
if (item->type() == QGraphicsItem::UserType + 1)
{
delete item;
}
}
}
QGraphicsView::keyPressEvent(event);
}
private:
QPoint m_lastPos;
RectItem* m_rectItem = nullptr;
int m_layerIndex = 0;
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setBackgroundBrush(QBrush(Qt::gray, Qt::CrossPattern));
GraphicsView view;
view.setScene(&scene);
view.setFixedSize(800, 600);
view.show();
return app.exec();
}
```
代码中,RectItem是矩形的图形项,继承自QGraphicsItem。GraphicsView是继承自QGraphicsView的自定义视图,用于显示和操作矩形。其中,矩形的可拖拽、可缩放等操作都是在GraphicsView中实现的。同时,为了区分不同的矩形,每个矩形都有一个layerIndex属性,用于显示在不同的层中。
代码中还考虑了两个细节:
1. 鼠标在矩形的不同位置时,鼠标的提示信息不同。
2. 可以多次添加矩形,多个矩形之间能够区分不同层。
运行代码后,可以看到一个灰色背景的视图,可以通过鼠标拖拽放大缩小矩形。可以通过鼠标滚轮进行视图缩放,也可以通过鼠标左键拖拽视图进行移动。可以通过按Delete键删除选中的矩形。同时,每个矩形的ToolTip中会显示它所在的层。
阅读全文