程序运行截图如下:
关键的函数:
逻辑:通过滚轮事件,识别滚轮放大上移还是下移动,调用这个函数
源码如下:
mygraphicsview.h
#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H
#include <QObject>
#include <QGraphicsView>
QT_BEGIN_NAMESPACE
class QWheelEvent;
QT_END_NAMESPACE
class MyGraphicsView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyGraphicsView(QWidget *parent = 0);
~MyGraphicsView();
protected:
void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
void magnify();
void shrink();
void scaling(qreal scaleFactor);
private:
qreal m_scalingOffset;
};
#endif // MYGRAPHICSVIEW_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QGraphicsScene;
QT_END_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QGraphicsScene *m_scene;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
mygraphicsview.cpp
#include "mygraphicsview.h"
#include <QWheelEvent>
#include <QPoint>
#include <QDebug>
MyGraphicsView::MyGraphicsView(QWidget *parent)
: QGraphicsView(parent)
{
m_scalingOffset=1;
}
MyGraphicsView::~MyGraphicsView()
{
}
void MyGraphicsView::magnify()
{
if(m_scalingOffset>1.3)
return;
m_scalingOffset+=0.1;
scaling(m_scalingOffset);
}
void MyGraphicsView::shrink()
{
if(m_scalingOffset<0.9)
return;
m_scalingOffset-=0.1;
scaling(m_scalingOffset);
}
void MyGraphicsView::scaling(qreal scaleFactor)
{
qDebug()<<this->sceneRect();
scale(scaleFactor,scaleFactor);
}
void MyGraphicsView::wheelEvent(QWheelEvent *event)
{
QPoint sroll=event->angleDelta();
sroll.y()>0?magnify():shrink();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QGraphicsRectItem>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_scene=new QGraphicsScene;
QGraphicsRectItem *item=new QGraphicsRectItem;
item->setPos(0,0);
item->setBrush(QBrush(Qt::red));
item->setRect(0,0,100,100);
m_scene->addItem(item);
ui->graphicsView->setSceneRect(-100,-100,100,100);
ui->graphicsView->setScene(m_scene);
}
Widget::~Widget()
{
delete ui;
}