QGraphicsView实现图片放大、缩小、鼠标拖动、以鼠标点放大缩小

1. 工程配置文件 pro

1 QT       += core gui
 2 
 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 4 
 5 CONFIG += c++11
 6 
 7 # The following define makes your compiler emit warnings if you use
 8 # any Qt feature that has been marked deprecated (the exact warnings
 9 # depend on your compiler). Please consult the documentation of the
10 # deprecated API in order to know how to port your code away from it.
11 DEFINES += QT_DEPRECATED_WARNINGS
12 
13 # You can also make your code fail to compile if it uses deprecated APIs.
14 # In order to do so, uncomment the following line.
15 # You can also select to disable deprecated APIs only up to a certain version of Qt.
16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
17 
18 SOURCES += \
19     ImageWidget.cpp \
20     main.cpp \
21     mainwindow.cpp
22 
23 HEADERS += \
24     ImageWidget.h \
25     mainwindow.h
26 
27 FORMS += \
28     mainwindow.ui
29 
30 # Default rules for deployment.
31 qnx: target.path = /tmp/$${TARGET}/bin
32 else: unix:!android: target.path = /opt/$${TARGET}/bin
33 !isEmpty(target.path): INSTALLS += target
34 
35 RESOURCES += \
36

2. main.cpp

1 #include "mainwindow.h"
 2 
 3 #include <QApplication>
 4 
 5 int main(int argc, char *argv[])
 6 {
 7     QApplication a(argc, argv);
 8     MainWindow w;
 9     w.show();
10     return a.exec();
11

3. mainwindow.h

1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 #include <QMainWindow>
 5 #include <QPixmap>
 6 #include <QGraphicsScene>
 7 #include <QGraphicsPixmapItem>
 8 #include <QWheelEvent>
 9 
10 #include "ImageWidget.h"
11 
12 QT_BEGIN_NAMESPACE
13 namespace Ui { class MainWindow; }
14 QT_END_NAMESPACE
15 
16 class MainWindow : public QMainWindow
17 {
18     Q_OBJECT
19 
20 public:
21     MainWindow(QWidget *parent = nullptr);
22     ~MainWindow();
23 
24     void recvShowPicSignal(QImage image);//接收并显示图片的函数
25 private:
26     Ui::MainWindow *ui;
27     ImageWidget *m_Image;
28 };
29 #endif // MAINWINDOW_H

4. mainwindow.cpp

1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3 
 4 MainWindow::MainWindow(QWidget *parent)
 5     : QMainWindow(parent)
 6     , ui(new Ui::MainWindow)
 7 {
 8     ui->setupUi(this);
 9 
10     setWindowTitle(QStringLiteral("QtQGraphicsView实现图片放大、缩小、鼠标拖动、以鼠标点放大缩小"));
11 
12     QPixmap *backgroundPixmap = new QPixmap(":/new/prefix1/QtImage.png");
13     QImage sizedImage = QImage(backgroundPixmap->toImage());
14     recvShowPicSignal(sizedImage);
15 }
16 
17 MainWindow::~MainWindow()
18 {
19     delete ui;
20 }
21 
22 void MainWindow::recvShowPicSignal(QImage image)
23 {
24     ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
25     ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
26 
27     QPixmap ConvertPixmap = QPixmap::fromImage(image);//The QPixmap class is an off-screen image representation that can be used as a paint device
28     QGraphicsScene  *qgraphicsScene = new QGraphicsScene;//要用QGraphicsView就必须要有QGraphicsScene搭配着用
29     m_Image = new ImageWidget(&ConvertPixmap);//实例化类ImageWidget的对象m_Image,该类继承自QGraphicsItem,是自己写的类
30     int nwith = ui->graphicsView->width();//获取界面控件Graphics View的宽度
31     int nheight = ui->graphicsView->height();//获取界面控件Graphics View的高度
32     m_Image->setQGraphicsViewWH(nwith,nheight);//将界面控件Graphics View的width和height传进类m_Image中
33     qgraphicsScene->addItem(m_Image);//将QGraphicsItem类对象放进QGraphicsScene中
34     ui->graphicsView->setSceneRect(QRectF(-(nwith/2),-(nheight/2),nwith,nheight));//使视窗的大小固定在原始大小,不会随图片的放大而放大(默认状态下图片放大的时候视窗两边会自动出现滚动条,并且视窗内的视野会变大),防止图片放大后重新缩小的时候视窗太大而不方便观察图片
35     ui->graphicsView->setScene(qgraphicsScene);//Sets the current scene to scene. If scene is already being viewed, this function does nothing.
36     ui->graphicsView->setFocus();//将界面的焦点设置到当前Graphics View控件
37

5. mainwindow.ui

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <ui version="4.0">
 3  <class>MainWindow</class>
 4  <widget class="QMainWindow" name="MainWindow">
 5   <property name="geometry">
 6    <rect>
 7     <x>0</x>
 8     <y>0</y>
 9     <width>600</width>
10     <height>400</height>
11    </rect>
12   </property>
13   <property name="windowTitle">
14    <string>MainWindow</string>
15   </property>
16   <widget class="QWidget" name="centralwidget">
17    <widget class="QGraphicsView" name="graphicsView">
18     <property name="geometry">
19      <rect>
20       <x>0</x>
21       <y>0</y>
22       <width>600</width>
23       <height>400</height>
24      </rect>
25     </property>
26    </widget>
27   </widget>
28  </widget>
29  <resources/>
30  <connections/>
31

6. ImageWidget.h

1 #ifndef IMAGEWIDGET_H
 2 #define IMAGEWIDGET_H
 3 
 4 #include <QWidget>
 5 #include <QtGui>
 6 #include <QPixmap>
 7 #include <QPainter>
 8 #include <QRectF>
 9 #include <QMouseEvent>
10 #include <QPointF>
11 #include <QDragEnterEvent>
12 #include <QGraphicsSceneWheelEvent>
13 #include <QGraphicsItem>
14 
15 enum Enum_ZoomState{
16     NO_STATE,
17     RESET,
18     ZOOM_IN,
19     ZOOM_OUT
20 };
21 // class ImageWidget :public QObject, QGraphicsItem
22 class ImageWidget :public QGraphicsItem
23 {
24     //Q_OBJECT
25 public:
26     ImageWidget(QPixmap *pixmap);
27     QRectF  boundingRect() const;
28     void    paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
29     void    wheelEvent(QGraphicsSceneWheelEvent *event);
30     void    ResetItemPos();
31     void    mousePressEvent(QGraphicsSceneMouseEvent *event);
32     void    mouseMoveEvent(QGraphicsSceneMouseEvent *event);
33     void    mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
34     qreal   getScaleValue() const;
35     void    setQGraphicsViewWH(int nwidth,int nheight);
36 private:
37     qreal       m_scaleValue;
38     qreal       m_scaleDafault;
39     QPixmap     m_pix;
40     int         m_zoomState;
41     bool        m_isMove;
42     QPointF     m_startPos;
43 };
44 #endif // IMAGEWIDGET_H

7. ImageWidget.cpp

1 #include "ImageWidget.h"
  2 
  3 #include <QDebug>
  4 #include <QGraphicsSceneMouseEvent>
  5 #include <QPointF>
  6 #include <QGraphicsSceneDragDropEvent>
  7 #include <QDrag>
  8 #include <math.h>
  9 
 10 ImageWidget::ImageWidget(QPixmap *pixmap)
 11 {
 12     m_pix = *pixmap;
 13     setAcceptDrops(true);//If enabled is true, this item will accept hover events; otherwise, it will ignore them. By default, items do not accept hover events.
 14     m_scaleValue = 0;
 15     m_scaleDafault = 0;
 16     m_isMove = false;
 17 }
 18 
 19 QRectF ImageWidget::boundingRect() const
 20 {
 21     return QRectF(-m_pix.width() / 2, -m_pix.height() / 2,
 22                   m_pix.width(), m_pix.height());
 23 }
 24 
 25 void ImageWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
 26                     QWidget *)
 27 {
 28     painter->drawPixmap(-m_pix.width() / 2, -m_pix.height() / 2, m_pix);
 29 }
 30 
 31 void ImageWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
 32 {
 33     if(event->button()== Qt::LeftButton)
 34     {
 35         m_startPos = event->pos();//鼠标左击时,获取当前鼠标在图片中的坐标,
 36         m_isMove = true;//标记鼠标左键被按下
 37     }
 38     else if(event->button() == Qt::RightButton)
 39     {
 40         ResetItemPos();//右击鼠标重置大小
 41     }
 42 
 43 }
 44 
 45 void ImageWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 46 {
 47     if(m_isMove)
 48     {
 49         QPointF point = (event->pos() - m_startPos)*m_scaleValue;
 50         moveBy(point.x(), point.y());
 51     }
 52 }
 53 
 54 void ImageWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
 55 {
 56     m_isMove = false;//标记鼠标左键已经抬起
 57 }
 58 
 59 
 60 void ImageWidget::wheelEvent(QGraphicsSceneWheelEvent *event)//鼠标滚轮事件
 61 {
 62     if((event->delta() > 0)&&(m_scaleValue >= 50))//最大放大到原始图像的50倍
 63     {
 64         return;
 65     }
 66     else if((event->delta() < 0)&&(m_scaleValue <= m_scaleDafault))//图像缩小到自适应大小之后就不继续缩小
 67     {
 68         ResetItemPos();//重置图片大小和位置,使之自适应控件窗口大小
 69     }
 70     else
 71     {
 72         qreal qrealOriginScale = m_scaleValue;
 73         if(event->delta() > 0)//鼠标滚轮向前滚动
 74         {
 75             m_scaleValue*=1.1;//每次放大10%
 76         }
 77         else
 78         {
 79             m_scaleValue*=0.9;//每次缩小10%
 80         }
 81         setScale(m_scaleValue);
 82         if(event->delta() > 0)
 83         {
 84             moveBy(-event->pos().x()*qrealOriginScale*0.1, -event->pos().y()*qrealOriginScale*0.1);//使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
 85         }
 86         else
 87         {
 88             moveBy(event->pos().x()*qrealOriginScale*0.1, event->pos().y()*qrealOriginScale*0.1);//使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
 89         }
 90     }
 91 }
 92 
 93 void ImageWidget::setQGraphicsViewWH(int nwidth, int nheight)//将主界面的控件QGraphicsView的width和height传进本类中,并根据图像的长宽和控件的长宽的比例来使图片缩放到适合控件的大小
 94 {
 95     int nImgWidth = m_pix.width();
 96     int nImgHeight = m_pix.height();
 97     qreal temp1 = nwidth*1.0/nImgWidth;
 98     qreal temp2 = nheight*1.0/nImgHeight;
 99     if(temp1>temp2)
100     {
101         m_scaleDafault = temp2;
102     }
103     else
104     {
105         m_scaleDafault = temp1;
106     }
107     setScale(m_scaleDafault);
108     m_scaleValue = m_scaleDafault;
109 }
110 
111 void ImageWidget::ResetItemPos()//重置图片位置
112 {
113     m_scaleValue = m_scaleDafault;//缩放比例回到一开始的自适应比例
114     setScale(m_scaleDafault);//缩放到一开始的自适应大小
115     setPos(0,0);
116 }
117 
118 qreal ImageWidget::getScaleValue() const
119 {
120     return m_scaleValue;
121

相关推荐

  1. vue系列--图片通过鼠标滚轮放大缩小指令

    2024-03-26 09:22:04       26 阅读
  2. qt,滚动条,放大缩小拖动图片

    2024-03-26 09:22:04       42 阅读
  3. js使用canvas实现图片鼠标滚轮放大缩小拖拽预览

    2024-03-26 09:22:04       23 阅读
  4. Qt处理鼠标滚轮事件,放大缩小地图

    2024-03-26 09:22:04       47 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-26 09:22:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-26 09:22:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-26 09:22:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-26 09:22:04       20 阅读

热门阅读

  1. C语言数据结构面试常见问题及答案

    2024-03-26 09:22:04       18 阅读
  2. Apache SeaTunnel 初识

    2024-03-26 09:22:04       16 阅读
  3. 模 块 篇

    2024-03-26 09:22:04       15 阅读
  4. iPhone 15 Pro LiDAR Module模组逆向(2024.3.23)

    2024-03-26 09:22:04       19 阅读
  5. 【Pandas】(5) eval和query

    2024-03-26 09:22:04       19 阅读
  6. 洛谷刷题 | B3621 枚举元组

    2024-03-26 09:22:04       18 阅读
  7. 每天一个数据分析题(二百二十七)

    2024-03-26 09:22:04       22 阅读
  8. Spark 检查点(checkpoint)

    2024-03-26 09:22:04       17 阅读
  9. ocr备份与管理

    2024-03-26 09:22:04       19 阅读
  10. 计算机网络(01)

    2024-03-26 09:22:04       19 阅读