Qt通过QGraphicsview实现简单缩放及还原效果

本文主要介绍通过QGraphicsview实现简单的缩放,以及缩放后还原原始大小。

1,自定义一个drawview继承QGraphicsview,缩放主要实现的函数为

void scale(qreal sx,qreal sy);

通过scale可以对view进行放大或缩小。

则可以在drawview中定义缩放slots为

void drawview::zoomIn(qreal delta)
{
    zoom(delta);
}

void drawview::zoomOut(qreal delta)
{
    zoom(1/delta);
}

void drawview::zoom(float scaleFactor)
{
    setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
    qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width();
    if (factor < 0.01 || factor > 2000)
        return;
    scale(scaleFactor, scaleFactor);

}

2,在mainwindows中引用drawview中的缩放函数

void MainWindow::ZoomIn()
{
    myview->zoomIn(1.2);
    qDebug()<<"zoomin";
}

void MainWindow::ZoomOut()
{
    qDebug()<<"zoomOut";
    myview->zoomOut(1.2);
}

3,还原原始大小

在看代码之前,我们可以先了解一下QMatrix,

可以看到QMatrix包含有6个参数,具体可以查看文档,简单来说

m11 - 水平缩放

m12 - 垂直拉伸

m21 - 水平拉伸

m22 - 垂直缩放

dx - 水平位移

dy - 垂直位移

通过这些参数,我们可以知道我们所需要调节的只有m11和m22,则把这两个参数设为1,不改变

void MainWindow::Original()
{
    myview->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
    QMatrix q;
    q.setMatrix(1,myview->matrix().m12(),myview->matrix().m21(),1,myview->matrix().dx(),myview->matrix().dy());
    myview->setMatrix(q,false);
}

PS:QGraphicsview的比例复原

我们都知道QGraphicsview的缩放是使用scale函数来设置的,但是每次设置scale都会在之前的基础上进行缩放,有时间会需要复原原来的缩放比例,就牵扯到QGraphicsView的复原,查找资料,在网上找到一个解决方案,贴在下面,望大家可以学习。

先了解QMatrix,QMatrix包含有6个参数,具体可以查看文档,简单来说

m11 - 水平缩放

m12 - 垂直拉伸

m21 - 水平拉伸

m22 - 垂直缩放

dx  - 水平位移

dy - 垂直位移

可以通过QGraphicsview::setMatrix函数来设置比例复原,主要是修改QMatrix的m11和m22来调整。

复原setMatrix
pView->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
QMatrix matrix;
matrix.setMatrix(1, pView->matrix().m12(), pView->matrix().m21(), 1, pView->matrix().dx(), pView->matrix().dy());
pView->setMatrix(matrix, false);

到此这篇关于Qt通过QGraphicsview实现简单缩放及还原效果的文章就介绍到这了,更多相关Qt QGraphicsview缩放及还原内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PyQt5实现无边框窗口的标题拖动和窗口缩放

    网上找了半天都找不到好用的PyQt5无边框窗口的实现,借鉴部分前辈的窗口拖放代码,自己实现了一下无边框窗口,问题可能还有一点,慢慢改吧 先做个笔记 py文件 #!/usr/bin/env python #-*- coding:utf-8 -*- from PyQt5.QtWidgets import QWidget, QLabel, QPushButton, QVBoxLayout from PyQt5.QtCore import Qt, QPoint from PyQt5.QtGui impo

  • Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例

    1.使用QChartView来缩放 (1)用鼠标框选一个矩形,把图放大到这个矩形 QChartView::setRubberBand(QChartView::RectangleRubberBand);//XY方向同时放大到鼠标画出的矩形大小(也可以设置为只放大X轴或Y轴) (2)setRubberBand函数同时也能使鼠标右键,具备缩小图的功能. 2.使用Qchart来平移和缩放 QChart::scroll(-10, 5);//整体平移(-10, 5),两个参数分别为Δx和Δy QChart:

  • PyQt5 对图片进行缩放的实例

    如下所示: def shrinkImage(self): ''' 缩小图片 :return: ''' scale = 0.8 #每次缩小20% img = QImage(self.path) #创建图片实例 mgnWidth = int(originWidth * scale) mgnHeight = int(originHeight * scale) #缩放宽高尺寸 size = QSize(mgnWidth, mgnHeight) pixImg = QPixmap.fromImage(img

  • Qt通过QGraphicsview实现简单缩放及还原效果

    本文主要介绍通过QGraphicsview实现简单的缩放,以及缩放后还原原始大小. 1,自定义一个drawview继承QGraphicsview,缩放主要实现的函数为 void scale(qreal sx,qreal sy); 通过scale可以对view进行放大或缩小. 则可以在drawview中定义缩放slots为 void drawview::zoomIn(qreal delta) { zoom(delta); } void drawview::zoomOut(qreal delta)

  • Qt利用QGraphicsView绘制跳舞的机器人

    目录 前言 静态机器人实现 1.QRobotHead 2.QRobotTorso 3.QRobotLimb 前言 最近新学了一招秘密武器,打算分享给大家!如何在QGraphicsView中制作一个跳舞的机器人. 首先,我们看一下显示效果: 让我们一起在这个炎热的夏天里奔跑吧!哈哈! 今天就让我们来解锁如何绘制这样一个会跳舞的机器人吧! 开发环境:VS2017 + Qt5.14.2 应用框架:QGraphicsView 在之前的文章中我有详细讲述QGraphicsView框架的基础,这里我们就直接

  • php简单备份与还原MySql的方法

    本文实例讲述了php简单备份与还原MySql的方法.分享给大家供大家参考,具体如下: 一.备份: <?php header ( "content-Type: text/html; charset=utf-8" ); //备份数据库 $host="localhost"; $user="root";//数据库账号 $password="123456";//数据库密码 $dbname="test";//数据

  • Qt实现矩形大小任意缩放的示例代码

    目录 现有功能 运行结果 源码 point_button.h point_button.cpp window.h window.cp main.cpp 现有功能 1.在窗口上绘制任意大小的矩形. 2.通过边角的拖曳按钮改变矩形大小. 运行结果 源码 point_button.h #ifndef POINTBUTTON_H #define POINTBUTTON_H #include <QPushButton> #include <QWidget> #include <QMou

  • Jquery实现简单的轮播效果(代码管用)

    废话不多说了,直接给大家贴jquery代码了,具体代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="css/index.css"> <script

  • Android实现手势滑动多点触摸缩放平移图片效果(二)

    上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android实现手势滑动多点触摸缩放平移图片效果,本篇继续完善我们的ImageView. 首先加入放大后的移动. 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Override public boolean onTouch(View v, MotionEvent event) { mScaleGestureDetector.onTouchEve

  • 简单实现Android放大镜效果

    利用之前学过的图形图像绘画技术和图片添加特效技术,我们来实现一个Android放大镜的简单应用. 最终效果如图 具体实现: 用来显示自定义的绘图类的布局文件 res/layout/main.xml: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns

  • 微信小程序页面缩放式侧滑效果的实现代码

    先给大家展示下效果图,大家感觉不错,请参考实现代码: 实现原理:点击按钮,往需要动画的div中添加或移除拥有动画效果的class. 由于微信小程序中不能操作page这个根节点,所以,只有用一个div(view)来模仿page根节点. 1.结构 <view class='page {{isFix?"pageShow":"pageHide"}}' > <view class='header'> <view class='h-toggle i

  • js实现简单的碰壁反弹效果

    本文实例可以使用js来实现简单的碰壁反弹效果,具体的内容请大家参考代码部分. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>碰撞小球</title> <style> #box{ width: 1000px; height: 800px; position: relative; border:

  • JS实现超简单的鼠标拖动效果

    本文实例讲述了JS实现超简单的鼠标拖动效果.分享给大家供大家参考,具体如下: 这里使用尽可能短的JavaScript代码写一个JS拖动,函数本身287个字符...如果不是考虑兼容性和变量封装,还可以更短点. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-s-drug-demo/ 具体代码如下: <title>尽可能短的写一个JS拖动</title> <body> <div id="demo&quo

随机推荐