• 7704阅读
  • 8回复

QT怎么实现幻灯片的切换效果 [复制链接]

上一主题 下一主题
离线insharecgc
 
只看楼主 倒序阅读 楼主  发表于: 2011-11-28
请问亲们有什么方法,或什么类来提供支持图片切换时的自定义效果,比如逐渐出现,慢慢退出等。
离线ninsun

只看该作者 1楼 发表于: 2011-11-28
没有发现过这种现成的淡入淡出类, 只有一个比较笼统的动画类可以用.可以实现图片的移动动画.
淡入淡出,百叶窗神马的特效还不知道怎么实现...
离线insharecgc
只看该作者 2楼 发表于: 2011-11-28
回 1楼(ninsun) 的帖子
“图片的移动动画” 有没有每一张图片出现时的效果呢?
离线voidbroken

只看该作者 3楼 发表于: 2011-11-28
移入移出可以用动画类来操作,图片的本身淡入淡出,或渐隐,需要用模板来合成,大多数为一张黑白图,通过原图和模板图的融合来实现,
离线insharecgc
只看该作者 4楼 发表于: 2011-11-28
回 3楼(voidbroken) 的帖子
请问有简单实例参考吗?谢谢您了
离线voidbroken

只看该作者 5楼 发表于: 2011-11-30
#include <QtCore>
#include <QtGui>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget w;
    w.setFixedSize(550, 550);

    QLabel *labelPic = new QLabel;
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(labelPic);
    w.setLayout(layout);

    QPixmap p1("image/opengl-examples.png");
    QPixmap p2("image/padnavigator-example.png");
    QPixmap p3("image/paintsystem-painterpath.png");
    QPixmap p4("image/paintsystem-svg.png");
    p1 = p1.scaled(labelPic->size());
    p2 = p2.scaled(labelPic->size());
    p3 = p3.scaled(labelPic->size());
    p4 = p4.scaled(labelPic->size());
    QList<QPixmap> listPic;
    listPic << p2 << p1 << p3 << p4;
    w.show();

    int index = 0;
    QPixmap mixPixmap(labelPic->size());
    QPainter painter(&mixPixmap);

    int iTransform = 3000; // ms
    QElapsedTimer t2;
    int iPos= 0;

    QTime t1;
    t1.start();
    while(1)
    {
        if (t1.elapsed() > 2000)//because setPixmap clears any previous content
        {
            //move right to left
            t2.start();
            qint64 durationSecond = 0;
            QSize size = mixPixmap.size();
            iPos = 0;
            while(t2.elapsed() < iTransform)
            {
                durationSecond = t2.elapsed();
                iPos = durationSecond*size.width()/iTransform;
                //

                if (index%4 > 0)
                    painter.drawPixmap(mixPixmap.rect().adjusted(0,0,-iPos,0), listPic[index%4-1], mixPixmap.rect().adjusted(iPos,0,0,0));
                //convert
                painter.drawPixmap(mixPixmap.rect().adjusted(size.width()-iPos,0,0,0), listPic[index%4], mixPixmap.rect().adjusted(0,0,iPos-size.width(),0));
                QApplication::processEvents();
                labelPic->setPixmap(mixPixmap);
            }

            index++;
            t1.restart();
        }
        else
            QApplication::processEvents();
    }
    return app.exec();//no use
}
离线novesky

只看该作者 6楼 发表于: 2011-11-30
其实很简单,我写过一个一个特效的库,支持几十种,出于某些原因,暂不能开源。提示下还是可以的
对于渐变,可以用前后两张图片合成,painter的透明度根据目前特效第几帧来算。
其他的那些覆盖,移动,百叶窗,扇形展开等等各种效果,可以在前一张图片的基础上,计算出后面一张要覆盖的区域,然后绘制上去。整个特效的核心就是如何计算某一帧时两幅图各为哪些区域。我绘制的时候qpainter要用到setClipRegion()
另一些图片会发生形变的效果,要其实主要是计算某一帧时的变换矩阵。这种特效我还没想到什么完美的方法和以上两类特效的接口比较好的整合在一起,单独些了一个类。

所有这些特效用一些很基本的类就能做到了,qpainter, qregion, 播放的时候用个timerEvent, 不需要其他东西了。记住,最关键的是算两张图片的绘制区域。

希望对你有所帮助。
离线insharecgc
只看该作者 7楼 发表于: 2011-12-03
回 5楼(voidbroken) 的帖子
谢谢您的,思路理解了
离线insharecgc
只看该作者 8楼 发表于: 2011-12-03
回 6楼(novesky) 的帖子
谢谢您的提醒
快速回复
限100 字节
 
上一个 下一个