QGraphicsView实现图片放大、缩小、鼠标拖动、以鼠标点放大缩小
创始人
2024-11-16 18:39:02

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   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   5 #include   6 #include   7 #include   8 #include   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   2   3  MainWindow  4    5     6      7     0  8     0  9     600 10     400 11     12    13    14    MainWindow 15    16    17     18      19       20       0 21       0 22       600 23       400 24       25      26     27    28   29   30   31

6. ImageWidget.h

1 #ifndef IMAGEWIDGET_H  2 #define IMAGEWIDGET_H  3   4 #include   5 #include   6 #include   7 #include   8 #include   9 #include  10 #include  11 #include  12 #include  13 #include  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    4 #include    5 #include    6 #include    7 #include    8 #include    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

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...