Qt实现图片翻转(开源)_qt::keepaspectratiobyexpanding-程序员宅基地

技术标签: 翻转  Qt  图片  Qt有什么好玩的?  

flipimgf.gif

 

一、思路

       使用Qt的Graphics View Framework可以非常容易实现翻转的效果。该框架中的item可以通过设置QGraphicsRotation实现沿x轴、y轴和z轴(垂直于屏幕)方向上的旋转。再配合上动画便能达到上图的效果。

 

二、关键代码

    1.既然是基于图形视图框架,那view是必不可少的。从基类中派生出我们的视图类FlipView:

  FlipView : public QGraphicsView

     在这个demo中视图和场景都不是主角。场景无需做其他设置,视图也只是做了一些简单的设置即可。

FlipView::FlipView(QWidget *parent):QGraphicsView(parent)
{
    //场景
    m_pScne = new QGraphicsScene();
    this->setScene(m_pScne);

    //item
    m_picture = new Picture();
    m_pScne->addItem(m_picture);

    //设置
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);  
    setViewportUpdateMode(FullViewportUpdate);   //刷新方式
    setCacheMode(CacheBackground);
    setRenderHints(QPainter::Antialiasing
                   | QPainter::SmoothPixmapTransform
                   | QPainter::TextAntialiasing);
}
void FlipView::drawBackground(QPainter *painter, const QRectF &rect)
{
    //重写drawBackground函数绘制视图的背景
    painter->drawPixmap(rect,QPixmap(":/back.jpg"),QRectF());
}
void FlipView::resizeEvent(QResizeEvent *event)
{
    //在视图大小变化时,让Item填充视图(缩放)
    fitInView(m_picture, Qt::KeepAspectRatioByExpanding);
}

    2.demo的主角,图片Item从QGraphicsObject中派生,其主要成员变量如下:

class Picture : public QGraphicsObject

   //主要成员变量:
    QList<QPixmap>              m_pixmaplist;     //图片列表
    int                         m_index;          //当前显示的图片的下标
    QPropertyAnimation*         m_roateAnimation; //m_itemRotation的动画 
    QParallelAnimationGroup*    m_animationGroup; //并行动画组,包括m_rotateAnimation和item的缩放动画
    QGraphicsRotation*          m_itemRotation;   //旋转

    在构造函数中做设置变换:

Picture::Picture(QGraphicsItem *parent):QGraphicsObject(parent)
{
    //初始化
    m_pixmaplist.append(QPixmap(":/01.jpg"));
    m_pixmaplist.append(QPixmap(":/02.jpg"));
    m_index = 0;
    m_bChanged = false;

    //设置该item的变换
    m_itemRotation = new QGraphicsRotation(this);
    m_itemRotation->setAxis(Qt::YAxis); //沿Y轴旋转
    m_itemRotation->setOrigin(QVector3D(boundingRect().width()/2,0,0)); //旋转基准位置为item的中心线
    this->setTransformations(QList<QGraphicsTransform *>()<<m_itemRotation);//<--关键-->

    //动画效果
    m_roateAnimation = new QPropertyAnimation(m_itemRotation, "angle"); //动画与m_itemRotation绑定
    m_roateAnimation->setDuration(1500);
    connect(m_roateAnimation,SIGNAL(finished()),this,SLOT(animationFinished()));
    connect(m_roateAnimation,SIGNAL(valueChanged(QVariant)),this,SLOT(animationValueChanged(QVariant)));

    QPropertyAnimation* scaleAnimation = new QPropertyAnimation(this,"scale"); //辅助效果,让item翻转的时候先缩小再放大
    scaleAnimation->setDuration(1500);
    scaleAnimation->setStartValue(1);
    scaleAnimation->setKeyValueAt(0.5,0.3);
    scaleAnimation->setEndValue(1);
    setTransformOriginPoint(this->boundingRect().center());

    m_animationGroup = new QParallelAnimationGroup(this);
    m_animationGroup->addAnimation(m_roateAnimation);
    m_animationGroup->addAnimation(scaleAnimation);
}

    在构造函数中的设置已经能够实现图片的翻转效果,为了让翻转效果更逼真,我们在旋转到90度左右(图片与屏幕垂直)时换一张图片显示,好像两张图片刚好是正反两面。

    在旋转动画的槽函数中进行判断:

void Picture::animationValueChanged(const QVariant &value){
    if(!m_bChanged){
        if(value.toDouble() >= 90 - 2 && value.toDouble() <= 90 + 2){ //旋转角度约在90度左右时切换当前图片下标
            if(++m_index >= m_pixmaplist.count()){
                m_index = 0;
            }
            m_bChanged = true; //一次旋转动画只需要判断一次是否到90度即可。
            update();
        }
    }
}

 

点击查看原文

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/can3981132/article/details/80173862

智能推荐

最大似然函数和最小二乘法解析_最大似然估计和最小二乘估计的区别和联系-程序员宅基地

文章浏览阅读1.1k次。最大似然函数和最小二乘法的区别和理解:对于最小二乘法,当从模型中选择n个样本观察值时,参数的合理性要求就是让模型更好地拟合这个样本数据,就是让观察值和估计值之间的误差更小。而对于最大似然函数,当从模型中选择n个样本观察值时,合理的参数估计就是让从模型抽取这n个样本观察值的概率最大化。这是从不同的原理出发的两种参数估计法。在最大似然法中,通过选择参数,让已知数据在某种意义上最有可能出现,这个某种..._最大似然估计和最小二乘估计的区别和联系

Educoder Linux从入门到精通 第4章 Linux文件/目录管理_educoderlinux目录文件的读取操作-程序员宅基地

文章浏览阅读896次,点赞3次,收藏3次。touch file1 file2rm -rf oldFile1 oldFile2可以使用ls命令来查看目录是否删除成功。mkdir newDir1 newDir2rm -rf oldDir2rmdir oldDir1 oldDir2cp file1 file2 Dircp file1 Dir/file1Cpymv file3 file4 Dirmv file5 file64cp -r Dir1 Dir2 Dircp -r Dir1 Dir/Dir1Cpymv Dir.._educoderlinux目录文件的读取操作

【CentOS】在Centos7 下无图形界面安装 Oracle11g-程序员宅基地

文章浏览阅读918次,点赞34次,收藏10次。修改文件 /etc/rc.d/rc.local。修改文件 /etc/rc.d/rc.local。修改文件 /etc/rc.d/rc.local。将用户oracle加入到oinstall组。将用户oracle加入到oinstall组。将用户oracle加入到oinstall组。创建用户oracle 并加入到dba组。创建用户oracle 并加入到dba组。创建用户oracle 并加入到dba组。禁止开机使用firewalld防火墙。禁止开机使用firewalld防火墙。禁止开机使用firewalld防火墙。

数据思维 实验二 线性代数 (大数据数学基础(Python语言描述))_输出该工厂四个季度生产a b numpy-程序员宅基地

文章浏览阅读3.7k次,点赞14次,收藏57次。一、实验目的及要求掌握行列式的应用。掌握矩阵运算的计算机语言描述。二、实验主要内容1、已知等差序列中前 nnn 项的和为 Sn=an2+bn(n∈N),S_{n}=a n^{2}+b n(n \in N),Sn​=an2+bn(n∈N), 假设等差序列 {an}\left\{a_{n}\right\}{an​} 的前 mmm 项 的和为 30,前 2m2 m2m 项的和为 100,求它的前 3m3 m3m 项的和。根据等差数列求和公式性质:在等差数列中,若SmS_mSm​为该数列的前mmm项和,_输出该工厂四个季度生产a b numpy

zookeeper 大量连接断开重连原因排查_zookeeper服务leader断开连接报错-程序员宅基地

文章浏览阅读7.4k次。问题现象最后发现线上的zookeeper的日志zookeeper.out 文件居然有6G,后来设置下日志为滚动输出,参考:http://blog.csdn.net/hengyunabc/article/details/19006911但是改了之后,发现一天的日志量就是100多M,滚动日志一天就被冲掉了,这个不科学。再仔细查看下日志里的内容,发现有很多连接建立好,马上又断开:_zookeeper服务leader断开连接报错

我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)-程序员宅基地

文章浏览阅读1.8k次。在上一篇《我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)》中提到的两个类:GameConf:负责管理游戏的初始化设置信息。GameService:负责游戏的逻辑实现。其中GameConf的代码如下:cn\oyp\link\utils\GameConf.java[java] view pla

随便推点

分享一下老型号macbook pro在win10下安装BootCamp6.0驱动的方法_cirrus logic cs4206b-程序员宅基地

文章浏览阅读7.5w次,点赞3次,收藏43次。本人mac pro 2011的本子,直接换了块ssd硬盘(该盘从另一非mac电脑拿过来的,里面只有win10系统),换上后驱动都正常就是没有声音,耳机孔出有红灯光。按以下方法将声卡装好了,也有声音了。装好后声卡驱动显示的是Cirrus Logic CS4206B(AB 28),之前一直显示High Definition 这个。以下转自:http://bbs.feng.com/for_cirrus logic cs4206b

[Matlab] matlab将三维数组转为二维数组_怎么用matlab把三维数组,保存为n个二维数组-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏12次。在使用matlab做实验时,我遇到一个问题是将一个303012的三维数组转化成3012的数组,采用平均值的方式,在y轴上取平均值。首先取平均值matrix = mean(matrix,1);然后size(matrix)发现维度为301*12,把脱狱的维度去掉可以使用matrix = squeeze(matrix);综上:具体实现代码为:matrix = squeeze(mean(matrix..._怎么用matlab把三维数组,保存为n个二维数组

ST 意法半导体人工智能(AI)X-CUBE-AI 扩展包入门指南-程序员宅基地

文章浏览阅读1.2k次,点赞37次,收藏33次。X-CUBE-AI 通过提供在计算和存储器(RAM 和闪存)方面均已优化的自动神经网络库生成器扩展STM32CubeMX,该生成器将预训练的神经网络从最常用的 DL 框架(如 Caffe、Keras、Lasagne 和 ConvnetJS)转换为自动集成到最终用户项目的库。X-CUBE-AI 内核引擎,如图 1 和图 2 所示,是 X-CUBE-AI 扩展包的一部分,之后将在第 1.3 节 介绍。本文档的第二部分详细说明了 X-CUBE-AI 自动生成的 NN 库,以及嵌入式客户端推理 API。

python request库用法_Python学习之Requests库-程序员宅基地

文章浏览阅读295次。python中的Requests库是封装好的用来请求http并返回对应结果的python用具初识Requests库Requests环境准备安装piphttps://pypi.python.org/pypi/pip#downloads点击上面的连接下载pip,完成后解压到本地目录,在cmd命令行下进入解压目录执行下面命令:python setup.py install完成之后,在命令行下执行pip命..._unresolved import: requests

电子邮件伪造_伪装别人的邮件地址发邮件-程序员宅基地

文章浏览阅读1.1k次,点赞24次,收藏30次。电子邮件伪造是指发送者故意篡改邮件头部信息,以使邮件看起来似乎是来自另一个人或组织的行为。这种行为可能用于欺骗、诈骗、垃圾邮件发送等目的。_伪装别人的邮件地址发邮件

《深度学习中的自适应学习率优化算法详解与应用》_自适应优化算法-程序员宅基地

文章浏览阅读476次,点赞9次,收藏9次。在深度学习领域,优化算法一直是研究和应用的热点之一。其中,自适应学习率优化算法因其在训练深度神经网络时的高效性备受关注。本文将深入探讨自适应学习率优化算法的原理,详细解析其在深度学习中的应用,并结合实例进行演示。深度学习中的自适应学习率优化算法是一个广泛研究的领域,本文只是对其中的一部分内容进行了深入解析。希望通过本文的介绍,读者能够对自适应学习率算法有更深入的理解,并在实际项目中灵活运用,提高深度学习模型的训练效果。_自适应优化算法

推荐文章

热门文章

相关标签