在Qt中,QGraphicsView
是一个用于显示和交互QGraphicsScene
的控件,它提供了丰富的功能来实现图形的缩放、旋转、平移等操作。下面是一个使用QGraphicsView
实现缩放的示例:
基本步骤
-
创建视图框架:
QGraphicsView
:显示窗口。QGraphicsScene
:管理场景中的图形项。QGraphicsItem
:场景中的图形项,需要继承重写paint
(绘制函数)和boundingRect
(大小位置函数)这两个纯虚函数。
-
在
QGraphicsView
中添加QGraphicsScene
:- 使用
QGraphicsView
的setScene
方法将QGraphicsScene
添加到视图中。
- 使用
-
设置缩放功能:
- 使用
QGraphicsView
的setTransformationAnchor
和setTransform
方法来设置视图的缩放行为。 setTransformationAnchor(QGraphicsView::AnchorUnderMouse)
:设置缩放锚点为鼠标位置,这样缩放会以鼠标所在点为中心。setTransform(QTransform::fromScale(scaleValue, scaleValue))
:通过变换矩阵QTransform
实现缩放,scaleValue
为缩放比例。
- 使用
-
处理缩放事件:
- 重写
QGraphicsView
的wheelEvent
方法来处理鼠标滚轮事件,从而实现滚轮缩放。 - 在
wheelEvent
中,根据鼠标滚轮的滚动方向(正或负)来调整缩放比例,并调用setTransform
方法应用缩放。
- 重写
示例代码
#ifndef MGRAAPHICSVIEW_H
#define MGRAAPHICSVIEW_H
#include <QGraphicsView>
#include <QWheelEvent>
class MGraaphicsView : public QGraphicsView {
public:
MGraaphicsView(QGraphicsScene *scene, QWidget *parent = nullptr);
protected:
virtual void wheelEvent(QWheelEvent *event);
private:
int m_zoom = 0;
double m_zoomnum = 1;
};
#endif // MGRAAPHICSVIEW_H
#include "mgraaphicsview.h"
#include <qmath.h>
#include <QDebug>
MGraaphicsView::MGraaphicsView(QGraphicsScene *scene, QWidget *parent)
: QGraphicsView(scene, parent) {
setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
setDragMode(QGraphicsView::ScrollHandDrag);
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
}
void MGraaphicsView::wheelEvent(QWheelEvent *event) {
event->accept();
QPoint angleDelta = event->angleDelta();
int deltaY = angleDelta.y();
// 根据滚轮的滚动方向调整缩放比例
double scaleFactor = 1.15; // 缩放因子
if (deltaY > 0) {
m_zoom *= scaleFactor; // 增加缩放级别
} else {
m_zoom /= scaleFactor; // 减少缩放级别
}
double m_zoom2 = m_zoom;
// 限制缩放级别的范围,例如:0.1 到 10 倍
m_zoom = qBound(0.1, m_zoom2, 10.0);
// 应用缩放变换
setTransform(QTransform::fromScale(m_zoom, m_zoom));
}
#include <QApplication>
//#include "MGraaphicsView.h" // 包含你的自定义图形视图类的头文件
int main(int argc, char *argv[]) {
QApplication app(argc, argv); // 创建应用程序对象
// 创建场景(如果需要的话)
QGraphicsScene *scene = new QGraphicsScene();
// 向场景中添加一些图形项(可选)
// scene->addEllipse(...);
// scene->addLine(...);
// ...
// 创建你的自定义图形视图对象
MGraaphicsView *view = new MGraaphicsView(scene);
// 设置视图的一些属性(可选)
view->setRenderHint(QPainter::Antialiasing);
view->setFixedSize(800, 600); // 或者使用其他大小
// 显示视图
view->show();
// 进入应用程序的事件循环
return app.exec();
}
关键点解释
- 缩放锚点:通过设置
setTransformationAnchor(QGraphicsView::AnchorUnderMouse)
,确保缩放操作以鼠标当前位置为中心。 - 缩放比例:通过调整
m_zoom
变量的值来控制缩放比例,并使用qPow(2, m_zoom)
来计算实际的缩放因子。 - 滚轮事件处理:在
wheelEvent
中,根据鼠标滚轮的滚动方向(event->delta()
的正负)来增加或减少缩放级别。
这个示例展示了如何使用QGraphicsView
实现基本的缩放功能。通过进一步定制和扩展,还可以实现更复杂的交互效果,如定点缩放、限制缩放范围等。