这篇文章是在这个基础上进行讨论的谈一谈分别利用opencv、Qt、matlab动态显示图片的实现

其实就是想找一种更加合适的方法进行图片的放大缩小以及动态显示。

这个是效果图

我把项目命名为Qtmline,因为之前做了和Qtimeline有关的东西

我们关心的是header files和source files里的文件

先说header files里的pixitem.h,放代码

#ifndef PIXITEM_H
#define PIXITEM_H#include <QGraphicsItem>
#include <QPixmap>
#include <QPainter>
#include <QRectF>
#include <QMouseEvent>
#include <QPointF>
#include <QDragEnterEvent>
#include <QGraphicsSceneWheelEvent>enum Enum_ZoomState{NO_STATE,RESET,ZOOM_IN,ZOOM_OUT
};enum Enum_ZoomTimes{ZOOM_IN_TIMES = 5,ZOOM_OUT_TIMES = -5,
};class PixItem : public QGraphicsItem        //继承自图元类,实现自定义的图元,,,qt预置的有直线,椭圆,文本图元,矩形图元等
{
public:PixItem(QPixmap *pixmap);   //构造函数初始化了变量pixQRectF boundingRect() const;    //实现自己的boundingRect 图元边界方法,完成以图元坐标系为基础增加两个像素点的冗余的工作void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); //重画图形函数void wheelEvent(QGraphicsSceneWheelEvent *event);void setZoomState(const int &zoomState);void mousePressEvent(QGraphicsSceneMouseEvent *event);void mouseMoveEvent(QGraphicsSceneMouseEvent *event);void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);int getScaleValue() const;void setScaleValue(const int &);private:qreal m_scaleValue;   //缩放值QPixmap pix;    //作为图元显示的图片int m_zoomState;bool m_isMove;QPointF m_startPos;
};#endif // PIXITEM_H

与之对应的pixitem.cpp代码

#include "pixitem.h"#include <QDebug>
#include <QGraphicsSceneMouseEvent>
#include <QPointF>
#include <QGraphicsSceneDragDropEvent>
#include <QDrag>
#include <math.h>//构造函数初始化了变量pix
PixItem::PixItem(QPixmap *pixmap)
{pix = *pixmap;setAcceptDrops(true);   //设置可拖拽m_scaleValue = 0;m_isMove = false;
}//实现自己的图元边界函数
QRectF PixItem::boundingRect() const
{return QRectF(-pix.width() / 2, -pix.height() / 2,pix.width(), pix.height());
}//只需QPainter的drawPixmap()函数将图元图片绘出即可
void PixItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *,QWidget *)
{painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix);
}//鼠标点击事件  局部缩放
void PixItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{m_startPos = event->pos();m_isMove = true;int scaleValue = m_scaleValue;if(m_zoomState == ZOOM_IN)       //局部放大{scaleValue++;}else if(m_zoomState == ZOOM_OUT)        //局部缩小{scaleValue--;}if (scaleValue > ZOOM_IN_TIMES || scaleValue < ZOOM_OUT_TIMES)return;if (m_scaleValue != scaleValue){setTransformOriginPoint(event->pos().x(), event->pos().y());}m_scaleValue = scaleValue;qreal s;//实现局部缩放if(m_scaleValue > 0){s = pow(1.1, m_scaleValue);        //放大 计算x的y方次 参数都是double类型}else{s = pow(1 / 1.1, -m_scaleValue);      //缩小}setScale(s);
}void PixItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{if(m_isMove){QPointF point = event->pos() - m_startPos;moveBy(point.x(), point.y());}
}void PixItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *)
{m_isMove = false;
}//使用滚轮整体缩放
void PixItem::wheelEvent(QGraphicsSceneWheelEvent *event)
{setZoomState(NO_STATE);int scaleValue = m_scaleValue;if(event->delta() > 0)  //delta()为正,滚轮向上滚{scaleValue++;}else{scaleValue--;}if (scaleValue > ZOOM_IN_TIMES || scaleValue < ZOOM_OUT_TIMES)return;m_scaleValue = scaleValue;qreal s;if(m_scaleValue > 0){s = pow(1.1, m_scaleValue);        //放大 计算x的y方次 参数都是double类型}else{s = pow(1 / 1.1, -m_scaleValue);      //缩小}setScale(s);setTransformOriginPoint(event->pos().x(), event->pos().y());
}//从widget获取的缩放值,用于同步滚轮和按键
void PixItem::setScaleValue(const int &scaleValue)
{if (scaleValue > ZOOM_IN_TIMES || scaleValue < ZOOM_OUT_TIMES)return;m_scaleValue = scaleValue;qreal s;if(m_scaleValue > 0){s = pow(1.1, m_scaleValue);        //放大 计算x的y方次 参数都是double类型}else{s = pow(1 / 1.1, -m_scaleValue);      //缩小}setScale(s);
}void PixItem::setZoomState(const int &zoomState)
{m_zoomState = zoomState;if (m_zoomState == RESET){m_scaleValue = 0;setScale(1);setTransformOriginPoint(0, 0);}
}int PixItem::getScaleValue() const
{return m_scaleValue;
}

Qtmline.h中是这样的

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_Qtmline.h"
#include <QProgressBar>
#include <QVBoxLayout>
#include <QPushButton>
#include <QTimeLine>
#include <QGraphicsEllipseItem>
#include <QGraphicsItemAnimation>
#include <QGraphicsScene>
#include <QGraphicsView>
#include "pixitem.h"
#include <QPixmap>
#include <QLabel>
#include <QTimerEvent>class Qtmline : public QMainWindow
{Q_OBJECTpublic:Qtmline(QWidget *parent = Q_NULLPTR);private slots:int OnBtnStart();int OnBtnBig();int OnBtnMove();
private:Ui::QtmlineClass ui;PixItem *m_pixItem;QGraphicsScene *m_graphicsScene;QGraphicsView *m_graphicsView;int m_timerId;void timerEvent(QTimerEvent * event);int m_flag;
};

Qtmline.cpp是这样的

#include "Qtmline.h"
#include <QMessageBox>Qtmline::Qtmline(QWidget *parent): QMainWindow(parent),m_flag(0)
{ui.setupUi(this);m_timerId = startTimer(60);connect(ui.BtnStart, SIGNAL(clicked()), SLOT(OnBtnStart()));connect(ui.BtnBig, SIGNAL(clicked()), SLOT(OnBtnBig()));connect(ui.BtnMove, SIGNAL(clicked()), SLOT(OnBtnMove()));
}
int Qtmline::OnBtnStart()
{QGraphicsScene *m_graphicsScene = new QGraphicsScene;m_graphicsScene->setSceneRect(-200, -200, 400, 400);QPixmap *pixmap = new  QPixmap("D:\\000.png");m_pixItem = new PixItem(pixmap);m_graphicsScene->addItem(m_pixItem);m_pixItem->setPos(0, 600);m_graphicsView = new QGraphicsView;m_graphicsView->setScene(m_graphicsScene);m_graphicsView->setMinimumSize(400, 400);ui.GLayout->addWidget(m_graphicsView);//QMessageBox::information(this, "ok", "Successful Connect");return 0;
}
int Qtmline::OnBtnBig()
{//QMessageBox::information(this, "ok", "Successful Connect");m_graphicsView->scale(2, 2);return 0;
}int Qtmline::OnBtnMove()
{//QMessageBox::information(this, "ok", "Successful Connect");m_flag = 1;return 0;
}
void Qtmline::timerEvent(QTimerEvent * event)
{// 可以有多个定时器,每个的定时器有不同的处理  if (event->timerId() == m_timerId&&m_flag==1){m_pixItem->moveBy(0, -50);update(); // 重绘  }
}

main.cpp是这样的

#include "Qtmline.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Qtmline w;w.show();return a.exec();
}

接下来介绍Qtmline.ui文件

这个直接拖进来就行,我命名成了GLayout它是Grid Layout 类中的

然后是三个按钮

具体的代码仔细看就明白了,显示主要是这个

 QGraphicsScene *m_graphicsScene = new QGraphicsScene;m_graphicsScene->setSceneRect(-200, -200, 400, 400);QPixmap *pixmap = new  QPixmap("D:\\000.png");m_pixItem = new PixItem(pixmap);m_graphicsScene->addItem(m_pixItem);m_pixItem->setPos(0, 600);m_graphicsView = new QGraphicsView;m_graphicsView->setScene(m_graphicsScene);m_graphicsView->setMinimumSize(400, 400);ui.GLayout->addWidget(m_graphicsView);

移动主要是通过Qtime实现的

void Qtmline::timerEvent(QTimerEvent * event)
{// 可以有多个定时器,每个的定时器有不同的处理  if (event->timerId() == m_timerId&&m_flag==1){m_pixItem->moveBy(0, -50);update(); // 重绘  }
}

放大缩小是由这个方法

int Qtmline::OnBtnBig()
{//QMessageBox::information(this, "ok", "Successful Connect");m_graphicsView->scale(2, 2);return 0;
}

上面是放大的,缩小就可以这样改

int Qtmline::OnBtnBig()
{//QMessageBox::information(this, "ok", "Successful Connect");m_graphicsView->scale(0.8, 0.8);return 0;
}

可以点击下面的链接下载pixitem类
pixitem类

Qt实现长图片的放大缩小以及动态显示相关推荐

  1. iOS 仿淘宝实现商品规格图片的放大缩小功能

    刚好最近在做个商城项目,甲方爸爸说咱们要求不高,你就照着淘宝来就好,额~~~~ 好吧,咱就不吐槽了,直接开撸吧,惯例先上一下效果图 需求以及思路 我们要实现的功能有如下几个: 图片的全屏查看以及保存 ...

  2. html图片自动在div里放大,HTML5+CSS3实现图片的放大/缩小

    原标题:HTML5+CSS3实现图片的放大/缩小 最近做项目时,经常遇到需要图片缓慢放大的效果.我做的时候想到了几种方法,所以来总结一下. 1. 利用css改变图片的宽高,做出视觉上的放大. 首先,将 ...

  3. C语言实现BMP图片的放大缩小

    C语言实现BMP图片的放大缩小 BMP图片简介:BMP图片是windows操作系统中的标准图像文件格式,可以分为两类:设备相关位图(DDB)和设备无关位图(DIB),使用广泛.它采用位映射存储格式,除 ...

  4. Axure9图片拖动放大缩小

    Axure9 图片拖动放大缩小 1.设置两个文本域,分别放置图片的宽与高 2.图片的交互设置 3.效果 当去请教一个会的人会的东西,因为他会,会很爽快的说不会可以问我呀,但是当问到不会的东西时,就会说 ...

  5. C语言实现图片的放大缩小(附完整源码)

    C语言实现图片的放大缩小 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef unsig ...

  6. element-ui+js+vue——实现图片的放大缩小拖动等功能——技能提升

    elementui+js+vue--实现图片组件的封装 1. 实现图片的放大缩小 2. 实现图片的拖动功能 3. 实现图片的预览 最近同事在写一个关于 图片放大缩小拖动的功能,其实不止是图片,只要是在 ...

  7. jquery 实现点击图片居住放大缩小

    jquery 实现点击图片居住放大缩小 该功能是基于jquery实现的,所以 第一步则是引入jquery jquery下载地址:https://jquery.com/download/ 或者使用此时调 ...

  8. android 自由缩放图片大小,android Matrix实现图片随意放大缩小或拖动

    本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下 step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable- ...

  9. 小程序富文本提取图片可放大缩小

    小程序富文本提取图片可放大缩小 启发: step1 step2 step3 step4 step5 最后 启发: 因为最近有需求说在小程序商品的详情页里所有图片可以放大缩小,网上好像不太好找,就写了篇 ...

最新文章

  1. Storm原理与实践--大数据技术栈14
  2. 小程序海外也能做吗?小程序海外主体公司开发的案例
  3. boost::callable_traits添加成员指针的测试程序
  4. PHP的PHPStorm的使用姿势
  5. 计算机删除等级列在哪里,插入与删除Excel表格的单元格、行和列
  6. 正则表达式的一点说明
  7. C#的变迁史09 - C# 5.0 之调用信息增强篇
  8. seajs常用API整理
  9. DataBseDesign工作笔记005---将excel中的表导入到powerdesigner中
  10. J2EE事务并发控制策略总结
  11. 二层交换机和三层交换机的区别
  12. ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
  13. android back键不退出程序,Android按back键不退出当前Activity
  14. Logstash 原理分析/配置文件详解 时间 日期 时区 ip 反斜杠 grok在线地址 类型转换
  15. PHP开发基于Mirai的QQ机器人
  16. java.lang.NoSuchMethodError: breeze.linalg.DenseVector$.canSetD()
  17. Win32如何定义IP数据报的首部
  18. 关于 websocket 的 连接
  19. 出租车计价器的设计一
  20. 消消乐php源码,手游泡泡消消乐设计(内附代码)

热门文章

  1. Matplotlib 库柱形图设置颜色
  2. java list格式化_java 格式化输出
  3. 【国产虚拟仪器】基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(三)软件设计
  4. 2020 秋招总结:凡是过往,皆为序章
  5. vue的随意拖拽插件
  6. 19号笔刷 ps_【精品】PS绘画19号笔刷的运用方法
  7. pks服务器清除归档文件路径,霍尼韦尔PKS系统备份及恢复
  8. 买了联通CDMA无线上网卡
  9. 组合索引mysql语句_Mysql之组合索引方法详解
  10. 计算机英语大作业,英语学期大作业