qt,滚动条,放大缩小拖动图片

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QWheelEvent>
#include <QMouseEvent>
#include <QtDebug>

#include <math.h>
#include <QPainter>
#include <QTimer>
#include <QWidget>
#include<QPushButton>

namespace Ui {
   
class MainWindow;
}

class MainWindow : public QMainWindow
{
   
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void wheelEvent(QWheelEvent *event);        // 用鼠标滚轮事件实现图像放大缩小
    void paintEvent(QPaintEvent *);             //重绘事件
    void mousePressEvent(QMouseEvent *e);
    void mouseMoveEvent(QMouseEvent *e);
    void mouseReleaseEvent(QMouseEvent *e);

    void OnZoomInImage();
    void OnZoomOutImage();

private:
    Ui::MainWindow *ui;

    QString LocalFileName;
    QImage Image;
    int X_move;
    int Y_move;
    double ZoomValue;
    QPoint oldPos;
    bool isPressed;
};


class RulerWidget : public QWidget
{
   
public:
    RulerWidget(QWidget *parent = nullptr) : QWidget(parent)
    {
   
        setMinimumHeight(30); // 设置控件高度
        setStyleSheet("background-color: #F0F2F5;");
    }

protected:
    void paintEvent(QPaintEvent *event) override
    {
   
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);

        int width = this->width();
        int height = this->height();

        // 绘制刻度线
        painter.setPen(Qt::black);

        for (int i = 0; i <= width; i += 10)
        {
   
            bool isLargeTick = (i % 50 == 0); // 每隔50像素绘制一个大刻度线

            if (isLargeTick)
            {
   
                painter.drawLine(i, height - 10, i, height);
                painter.drawText(i - 10, height - 25, QString::number(i));
            }
            else
            {
   
                painter.drawLine(i, height - 5, i, height);
            }
        }
    }
};

#endif // MAINWINDOW_H

cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   
    ui->setupUi(this);


    LocalFileName = QString(":/img/test.PNG");
    ZoomValue = 1.0;
    X_move= 0;
    Y_move= 0;

}

MainWindow::~MainWindow()
{
   
    delete ui;
}


void MainWindow::paintEvent(QPaintEvent *event)
{
   
    if(LocalFileName.isNull())
    {
   
        return QWidget::paintEvent(event);
    }

    //加载图片
    if(Image.load(LocalFileName))
    {
   
        QPainter painter(this);
        //根据窗口计算应该显示的图片的大小
        int width = qMin(Image.width() , this->width());                                                //返回较小值
        int height = (width * 1.0)/(Image.width()*1.0 / Image.height());          //width/height图像跟label会根据宽对齐。 height / width则根据长对齐
        height = qMin(height , this->height());
        width = height * 1.0 *(Image.width() *1.0 / Image.height());

        // 平移
        painter.translate(this->width() / 2 + X_move, this->height() /2 + Y_move);     // int X_move , Y_move ; x y 轴平移的距离
        // 缩放
        painter.scale(ZoomValue , ZoomValue);                                          //qreal ZoomValue ;鼠标缩放位置

        // 绘制图像
        QRect pecRect(-width / 2 , -height /2 , width , height);              //画显示框  前两个参数是坐标原地(0,0 在label中心) 后两个天参数是长宽
        painter.drawImage(pecRect , Image);

    }else{
   
        qDebug() << "load failed";
    }

}


//鼠标滚轮事件
void MainWindow::wheelEvent(QWheelEvent *event)
{
   
    int value = event->delta();
    if(value > 0)
        OnZoomInImage();//放大
    else
        OnZoomOutImage();//缩小

    update();
}


void MainWindow::mousePressEvent(QMouseEvent *e)
{
   
    oldPos = e->pos();
    isPressed = true;
}
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
   
    if(!isPressed || ZoomValue==1.0)
      return QWidget::mouseMoveEvent(e);

    this->setCursor(Qt::SizeAllCursor);
    QPoint pos = e->pos();
    int xPtInterval = pos.x() - oldPos.x();
    int yPtInterval = pos.y() - oldPos.y();

    X_move+= xPtInterval;
    //Y_move+= yPtInterval;
    oldPos = pos;

    update();
}

void MainWindow::mouseReleaseEvent(QMouseEvent *e)
{
   
    Q_UNUSED(e);
    setCursor(Qt::ArrowCursor);
    isPressed = false;
}


void MainWindow::OnZoomInImage()
{
   
    ZoomValue += 0.10;
    if(ZoomValue >= 5.0)
    {
   
        ZoomValue = 5.0;
        return;
    }

    update();
}

void MainWindow::OnZoomOutImage()
{
   
    ZoomValue -= 0.10;
    if(ZoomValue <= 1.0)
    {
   
        ZoomValue = 1.0;
        return;
    }

    update();
}


相关推荐

  1. qt滚动放大缩小拖动图片

    2023-12-24 06:10:03       42 阅读
  2. vue系列--图片通过鼠标滚轮放大缩小指令

    2023-12-24 06:10:03       26 阅读
  3. Qt处理鼠标滚轮事件,放大缩小地图

    2023-12-24 06:10:03       47 阅读
  4. canvas图上绘制边框,可放大缩小,可拖动

    2023-12-24 06:10:03       16 阅读
  5. js使用canvas实现图片鼠标滚轮放大缩小拖拽预览

    2023-12-24 06:10:03       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-24 06:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-24 06:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-24 06:10:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-24 06:10:03       20 阅读

热门阅读

  1. Swift 检测 iCloud状态

    2023-12-24 06:10:03       44 阅读
  2. 做HSE安全管理体系认证能得到哪些的好处?

    2023-12-24 06:10:03       41 阅读
  3. centos安装apache2 https php

    2023-12-24 06:10:03       39 阅读
  4. Elasticsearch学习

    2023-12-24 06:10:03       36 阅读
  5. C语言初学6:循环

    2023-12-24 06:10:03       41 阅读
  6. 设计模式?!

    2023-12-24 06:10:03       39 阅读
  7. TCP的poll多路复用实现群聊

    2023-12-24 06:10:03       41 阅读
  8. 力扣:93. 复原 IP 地址(回溯)

    2023-12-24 06:10:03       37 阅读
  9. 什么是分布式事务

    2023-12-24 06:10:03       40 阅读
  10. nacos和gateway部署实践踩的坑

    2023-12-24 06:10:03       35 阅读