Qt QGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小_图片查看

news2024/9/21 22:59:11

QtQGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小

 头文件:

#ifndef TIMGWIDGET_H
#define TIMGWIDGET_H

#include <QGraphicsItem>
#include <QMainWindow>
#include <QObject>
#include <QWidget>

// class TImgWidget : public QGraphicsItem
// {
// public:
//     TImgWidget();
// };

#include <QWidget>
#include <QtGui>
#include <QPixmap>
#include <QPainter>
#include <QRectF>
#include <QMouseEvent>
#include <QPointF>
#include <QDragEnterEvent>
#include <QGraphicsSceneWheelEvent>
#include <QGraphicsItem>

enum Enum_ZoomState{
    NO_STATE,
    RESET,
    ZOOM_IN,
    ZOOM_OUT
};
// class ImageWidget :public QObject, QGraphicsItem
class TImgWidget :public QGraphicsItem
{
    //Q_OBJECT
public:
    TImgWidget(QPixmap *pixmap);
    QRectF  boundingRect() const;
    void    paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void    wheelEvent(QGraphicsSceneWheelEvent *event);
    void    ResetItemPos();
    void    mousePressEvent(QGraphicsSceneMouseEvent *event);
    void    mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void    mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    qreal   getScaleValue() const;
    void    setQGraphicsViewWH(int nwidth,int nheight);
private:
    qreal       m_scaleValue;
    qreal       m_scaleDafault;
    QPixmap     m_pix;
    int         m_zoomState;
    bool        m_isMove;
    QPointF     m_startPos;
};

#endif // TIMGWIDGET_H

cpp

#include "timgwidget.h"

//TImgWidget::TImgWidget() {}
#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QPointF>
#include <QGraphicsSceneDragDropEvent>
#include <QDrag>
#include <math.h>

TImgWidget::TImgWidget(QPixmap *pixmap)
{
    m_pix = *pixmap;
    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.
    m_scaleValue = 0;
    m_scaleDafault = 0;
    m_isMove = false;
}
QRectF TImgWidget::boundingRect() const
{
    return QRectF(-m_pix.width() / 2, -m_pix.height() / 2,
                  m_pix.width(), m_pix.height());
}

void TImgWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *,
                       QWidget *)
{
    painter->drawPixmap(-m_pix.width() / 2, -m_pix.height() / 2, m_pix);
}

void TImgWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if(event->button()== Qt::LeftButton)
    {
        m_startPos = event->pos();//鼠标左击时,获取当前鼠标在图片中的坐标,
        m_isMove = true;//标记鼠标左键被按下
    }
    else if(event->button() == Qt::RightButton)
    {
        ResetItemPos();//右击鼠标重置大小
    }

}

void TImgWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    if(m_isMove)
    {
        QPointF point = (event->pos() - m_startPos)*m_scaleValue;
        moveBy(point.x(), point.y());
    }
}

void TImgWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
{
    m_isMove = false;//标记鼠标左键已经抬起
}


void TImgWidget::wheelEvent(QGraphicsSceneWheelEvent *event)//鼠标滚轮事件
{
    if((event->delta() > 0)&&(m_scaleValue >= 50))//最大放大到原始图像的50倍
    {
        return;
    }
    else if((event->delta() < 0)&&(m_scaleValue <= m_scaleDafault))//图像缩小到自适应大小之后就不继续缩小
    {
        ResetItemPos();//重置图片大小和位置,使之自适应控件窗口大小
    }
    else
    {
        qreal qrealOriginScale = m_scaleValue;
        if(event->delta() > 0)//鼠标滚轮向前滚动
        {
            m_scaleValue*=1.1;//每次放大10%
        }
        else
        {
            m_scaleValue*=0.9;//每次缩小10%
        }
        setScale(m_scaleValue);
        if(event->delta() > 0)
        {
            moveBy(-event->pos().x()*qrealOriginScale*0.1, -event->pos().y()*qrealOriginScale*0.1);//使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
        }
        else
        {
            moveBy(event->pos().x()*qrealOriginScale*0.1, event->pos().y()*qrealOriginScale*0.1);//使图片缩放的效果看起来像是以鼠标所在点为中心进行缩放的
        }
    }
}

void TImgWidget::setQGraphicsViewWH(int nwidth, int nheight)//将主界面的控件QGraphicsView的width和height传进本类中,并根据图像的长宽和控件的长宽的比例来使图片缩放到适合控件的大小
{
    int nImgWidth = m_pix.width();
    int nImgHeight = m_pix.height();
    qreal temp1 = nwidth*1.0/nImgWidth;
    qreal temp2 = nheight*1.0/nImgHeight;
    if(temp1>temp2)
    {
        m_scaleDafault = temp2;
    }
    else
    {
        m_scaleDafault = temp1;
    }
    setScale(m_scaleDafault);
    m_scaleValue = m_scaleDafault;
}

void TImgWidget::ResetItemPos()//重置图片位置
{
    m_scaleValue = m_scaleDafault;//缩放比例回到一开始的自适应比例
    setScale(m_scaleDafault);//缩放到一开始的自适应大小
    setPos(0,0);
}

qreal TImgWidget::getScaleValue() const
{
    return m_scaleValue;
}

工程文件:

待更新。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快准齐的机器视觉:用上了就知道,检测还能怎么玩

随着工业4.0的到来 &#xff0c;工厂追求自动化&#xff0c;智能化的发展需求越来越高&#xff0c;机器视觉技术的发展也越来越受到人们关注。机器视觉能做什么&#xff0c;能做到什么程度很多人都只是有一定的了解&#xff0c;今天就这案例给大家看看。 这是一个端子生产委托…

基于Java实现(MVC)图书管理系统

需求分析 系统用户分为&#xff1a;借阅者&#xff08;包括学生、教师及其他用户&#xff09;、管理员 借阅者的主要功能&#xff1a; 个人信息管理&#xff1a;查看、修改个人基本信息&#xff1b;查询图书、借书、还书、查询借阅记录、本人可借图书总数、目前在借的数量等&…

基于jetpackCompose实现最简单的悬浮窗效果

最近在研究使用compose框架实现悬浮窗效果&#xff0c;期间遇到很多问题&#xff0c;各种搜索结果琳琅满目&#xff0c;不是插件就是非常复杂的代码&#xff0c;只能潜心研究&#xff0c;最后得出了这个几行代码就能实现悬浮窗的方案。 为了技术人的脑力能得到应有的回报&#…

PTA - C语言接口题集

目录 6-1 计算两个复数之积&#xff08;结构体函数&#xff09;6-2 字符定位&#xff08;返回字符的地址&#xff0c;指针&#xff09;6-3 求结构体平均成绩&#xff08;变量名(数组名)用.;指针(带有*)用->&#xff09;6-4 删除字符串中数字字符6-5 使用函数找出数组中的最大…

系统更新报“更新失败“

系统更新报"更新失败" 本章只针对统信UOS系统 系统检查更新失败&#xff0c;或者系统更新的过程中失败&#xff0c;或者提示依赖错误&#xff0c;检测更新失败。 故障处理&#xff1a; 检查下网络是否正常&#xff0c;系统时间是否正常&#xff1b;开启开发者&…

MOS管驱动电路阻值如何选取?以及为什么要有下拉电阻

开通时&#xff0c;电源为高电平&#xff0c;会通过Rg1给MOS的Cgs充电&#xff0c;关断时&#xff0c;Cgs通过Rg2放电.实现慢开快关的过程 如果驱动阻值太大&#xff0c;开关会很慢&#xff0c;会让MOS管的损耗增加&#xff0c;降低了效率&#xff0c;dv/dt&#xff0c;di/dt也…

电路基础 ---- 运放里的虚短虚断

令人稀里糊涂的虚短虚断 想必好多人在学习硬件电路分析时&#xff0c;都会听到虚短虚断这个专业术语&#xff0c;但是对于新手玩家&#xff0c;这个术语不好理解&#xff0c;比如我自己&#xff0c;经常将这两个概念混淆。最近刷到大佬的视频&#xff0c;讲解的非常简洁易懂&a…

蓝卓与用友、中控签署全面战略合作协议

8月9日&#xff0c;蓝卓数字科技有限公司&#xff08;以下简称“蓝卓”&#xff09;与用友网络科技股份有限公司&#xff08;以下简称“用友网络”&#xff09;与中控技术股份有限公司&#xff08;以下简称“中控技术”&#xff09;签署全面战略合作协议。三方将在平台产品融合…

MySQL5.7版本实现数据库审计功能

一、基本介绍 MySQL 数据库审计&#xff08;MySQL Database Auditing&#xff09;主要将用户对数据库的各类操作行为记录审计日志&#xff0c;以便日后进行跟踪、查询、分析&#xff0c;以实现对用户操作的监控和审计。审计是一项非常重要的工作&#xff0c;也是企业数据安全体…

1412312

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

BugKu练习记录:你喜欢下棋吗

题目&#xff1a; 密码全为小写&#xff0c;格式bugku{} 解压密码&#xff1a; 你喜欢下棋吗&#xff1f; 解压密码为小写 4423244324433534315412244543棋盘密码解密&#xff1a; thisispolybius用这个密码解压&#xff0c;打开flag.txt文件 一种5bit的编码 bugku里面的内…

Transformer 动画揭秘:数据处理的四大关键技术

0背景 Transformer 大模型&#xff0c;一种基于自注意力机制的神经网络架构&#xff0c;已被广泛应用于各种自然语言处理任务&#xff0c;比如&#xff1a;机器翻译、文本摘要、生成问答等。 从端到端的角度来看&#xff0c;Transformer 大模型中数据的处理流程主要包括四个阶…

基于matlab的行人和车辆检测系统

基于matlab的行人和车辆检测系统 【目标检测】基于计算机视觉&#xff0c;含GUI界面 算法&#xff1a;二帧差分法&#xff0c;三帧差分法&#xff0c;混合高斯建模&#xff0c;ViBe算法。 功能&#xff1a;对视频中出现的动态目标进行逐帧作差分析或ViBe算法检测&#xff0c;使…

[线程] 定时器 及 实现定时器

文章目录 一. 定时器二. 标准库中的定时器三. 实现定时器1. 创建MyTimerTask类2. 通过一定的数据结构, 保存多个任务3.MyTimer类的构造方法4. 实现schedule方法完整代码: 一. 定时器 定时器, 就是"闹钟"的效果 指定一个任务(Runnable), 并且指定一个时间, 此时这个任…

PMP核心知识点—之项目运行环境

知识点1&#xff1a;项目合规性 不合规的项目就不应该做。 知识点2&#xff1a;项目影响两大因素 组织过程资产、事业环境因素 知识点3&#xff1a;职能型以及项目型组织结构 知识点4&#xff1a;矩阵型组织结构 弱矩阵—平衡矩阵—强矩阵 (项目经理权力的强弱) 知识点5&am…

Oracle rac模式下undo表空间爆满的解决

文章目录 前言一、确认对应实例的undo表空间二、确认对应实例undo的文件位置三、确认回滚段使用情况四、检查undo segment状态五、创建新的undo表空间并进行切换六、等待原undo表空间segment状态变更为offline七、删除原undo表空间以及数据文件 前言 一、确认对应实例的undo表空…

如何把自动获取的ip地址固定

在大多数网络环境中&#xff0c;‌设备通常会自动从DHCP服务器获取IP地址。‌这种动态分配IP的方式虽然灵活方便&#xff0c;‌但在某些特定场景下&#xff0c;‌我们可能需要将设备的IP地址固定下来&#xff0c;‌以确保网络连接的稳定性和可访问性。‌本文将详细介绍如何把自…

C++知识点概述

C知识点概述 C是一种功能强大的编程语言&#xff0c;广泛应用于系统软件、游戏开发、高性能服务器和客户端应用等领域。在大学课程中&#xff0c;C通常作为计算机科学和软件工程学科的核心课程之一。以下是C的一些关键知识点&#xff0c;这些知识点构成了大学课程的基础。 1.…

CTF入门之奇怪的密码及图形编码总结篇(持续更新中ing)

CTF入门之奇怪的编码及图形编码(持续更新中ing UTF-8&#xff0c;unicode乱码社会主义核心价值观编码&#xff1a;在线解码&#xff1a; 与佛论禅&#xff1a;在线解密网站&#xff1a; 与熊论道&#xff1a;在线网站解密&#xff1a; 兽音&#xff1a;在线网站解密&#xff1a…

MySQL数据库(0)—— 云服务器安装MySQL

本篇主要介绍在Ubuntu环境下安装MySQL 一&#xff0c;查看系统版本 lsb_release -a二&#xff0c;添加MySQL APT 源 2.1 访问下载页面并下载发布包 传送门&#xff1a;MySQL :: Download MySQL APT Repository 下载之后&#xff0c;就可以通过 rz 命令上传到云服务器上&…