-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmygrar.cpp
More file actions
117 lines (98 loc) · 3.36 KB
/
Copy pathmygrar.cpp
File metadata and controls
117 lines (98 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "mygrar.h"
#include <QEvent>
#include <QWheelEvent>
#include <QScrollBar>
#include <QApplication>
// #include <QPropertyAnimation>
MyGraphicsArea::MyGraphicsArea(QWidget *parent)
: QGraphicsView(parent)
{
m_originalCursor = cursor();
}
void MyGraphicsArea::setZoomRange(qreal min, qreal max)
{
m_minZoom = min;
m_maxZoom = max;
}
void MyGraphicsArea::resetView()
{
resetTransform();
m_currentZoom = 1.0;
emit zoomChanged(m_currentZoom);
}
void MyGraphicsArea::setViewZoom(qreal zoom)
{
qreal acturalZoom = qBound(m_minZoom, zoom, m_maxZoom);
resetTransform();
scale(acturalZoom, acturalZoom);
m_currentZoom = acturalZoom;
emit zoomChanged(m_currentZoom);
}
void MyGraphicsArea::wheelEvent(QWheelEvent *event)
{
if (event->modifiers() & Qt::ControlModifier) {
// 计算缩放因子
const qreal zoomFactor = event->angleDelta().y() > 0 ? 1.1 : 0.9;
const qreal newZoom = qBound(m_minZoom, m_currentZoom * zoomFactor, m_maxZoom);
// 基于鼠标位置的缩放
QPointF oldPos = mapToScene(event->position().toPoint());
scale(newZoom / m_currentZoom, newZoom / m_currentZoom);
// QPropertyAnimation *anim = new QPropertyAnimation(this, "zoom");
// anim->setDuration(100);
// anim->setStartValue(m_currentZoom);
// anim->setEndValue(newZoom);
// anim->start(QAbstractAnimation::DeleteWhenStopped);
// 调整视图中心保持鼠标位置不变
QPointF newPos = mapToScene(event->position().toPoint());
QPointF delta = newPos - oldPos;
translate(delta.x(), delta.y());
m_currentZoom = newZoom;
emit zoomChanged(m_currentZoom);
event->accept();
} else if ((event->modifiers() & Qt::ShiftModifier) && (event->angleDelta().y() != 0)) {
// Shift+滚轮 = 水平滚动
QWheelEvent fakeEvent(event->position(), event->globalPosition(),
event->pixelDelta(), QPoint(event->angleDelta().y(), 0),
event->buttons(), event->modifiers()&~Qt::ShiftModifier, event->phase(),
event->inverted(), event->source());
QGraphicsView::wheelEvent(&fakeEvent);
event->accept();
} else {
QGraphicsView::wheelEvent(event); // 普通滚动行为
}
}
void MyGraphicsArea::mousePressEvent(QMouseEvent *event)
{
if (event->modifiers() & Qt::AltModifier) {
// Alt+点击 = 开始拖动视图
m_isDragging = true;
m_lastDragPos = event->pos();
setCursor(Qt::ClosedHandCursor);
event->accept();
return;
}
QGraphicsView::mousePressEvent(event);
}
void MyGraphicsArea::mouseMoveEvent(QMouseEvent *event)
{
if (m_isDragging) {
// 处理视图拖动
QPoint delta = event->pos() - m_lastDragPos;
m_lastDragPos = event->pos();
horizontalScrollBar()->setValue(horizontalScrollBar()->value() - delta.x());
verticalScrollBar()->setValue(verticalScrollBar()->value() - delta.y());
event->accept();
return;
}
QGraphicsView::mouseMoveEvent(event);
}
void MyGraphicsArea::mouseReleaseEvent(QMouseEvent *event)
{
if (m_isDragging) {
m_isDragging = false;
setCursor(m_originalCursor);
event->accept();
return;
}
QGraphicsView::mouseReleaseEvent(event);
}