码迷,mamicode.com
首页 > 其他好文 > 详细

Qt QGraphicsItem 绕中心旋转、放缩

时间:2015-01-21 13:11:53      阅读:566      评论:0      收藏:0      [点我收藏+]

标签:

最近用到了QGraphicsItem,可以通过QGraphicsItemAnimation使其产生动画效果。

QGraphicsItemAnimation自带了setPosAt()、setRotationAt()、setScaleAt()等方法可以用来移动、旋转、放缩QGraphicsItem,但其默认的OriginPoint是这个Item的左上角,虽然QGraphicsItem自带了setTransformOriginPoint()方法,但是设置以后没有效果,还是绕左上角放缩旋转,只好采取其他办法。从网上查了一番资料,最后用了下面这种矩阵变换的方法。

先设置QTimeLine:

    QTimeLine _timeLine;
        _timeLine.setDuration(3000);    //持续时间
    _timeLine.setLoopCount(0);        //无限循环
    _timeLine.setFrameRange(0, 100);//frameChanged()发出的值在0-100之间
    _timeLine.setCurveShape(QTimeLine::SineCurve);    //frameChanged()发出的值像sin曲线一样,1,2,...,99,100,99,...,2,1
    _timeLine.setUpdateInterval(25);    //更新频率(也就是frameChanged(int)的执行速度),每25ms更新一次,相当于每秒40帧,
    connect(&_timeLine, SIGNAL(frameChanged(int)), this, SLOT(scaleAnimation(int)));   
  _timeLine.start(); 

槽函数如下:

//头文件中的
private slots:
    void scaleAnimation(int frame); 

//源文件中的
void GraphicsItemAnimation::scaleAnimation(int frame)
{
    //_st是一个QGraphicsItem
    QRectF rect = _st->boundingRect();
    QPointF pt = _st->boundingRect().center();
    qreal scaleX_Y = (frame+50) / 100.0;
    QTransform tran;
    tran.translate(pt.x(), pt.y());
    tran.scale(scaleX_Y, scaleX_Y);
    _st->setTransform(tran);
    QTransform t;
    t.translate(-pt.x(), -pt.y());
    _st->setTransform(t, true);
}

 

Qt QGraphicsItem 绕中心旋转、放缩

标签:

原文地址:http://www.cnblogs.com/cLockey/p/4238432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!