3

スロットマシンのように画像のループが必要なアプリを作ろうとしています。ループする必要がある順序で画像があります。後でボタンを押すと、ある位置で停止する必要があります。QPixmapを使用して、指定した間隔で再描画できることはわかっていますが、より効率的な方法があると確信しています。私がやりたいのは、一定の速度で画像を無限にループさせることです。ボタンを押すと、停止する画像を計算し、アニメーションの速度を落とし、事前定義されたインデックスでx秒で停止します。ここではQtアニメーションフレームワークが使えると思います。無限ループの作り方がわかりません。前もって感謝します。

4

1 に答える 1

1

私が書いたコードの非常に単純化されたバージョン:

これは、アニメーション化されたテキストとほとんど必要なものを表示するウィジェットです。

class Labels : public QFrame {
    Q_OBJECT
    Q_PROPERTY( int offset READ offset WRITE setOffset )
public:
    /* The property used to animate the view */
    int off;
    QStringList texts;
    Label() : QFrame() {
        texts << "text 1" << "text 2" << "text 3" << "text 4";
        setFixedSize( 200, 200 );
    }
    void paintEvent(QPaintEvent *) {
        QPainter painter( this );
        int x = 20;
        int y = 20;
        foreach( QString str, texts ) {
            int y1 = y + off;
            /* Used to draw the texts as a loop */
            /* If texts is underneath the bottom, draw at the top */
            if ( y1 > height() ) { 
                y1 -= height();
            }
            painter.drawText( x, y1, str );
            y+= 50;
        }
    }

    int offset() {
        return off;
    }

    void setOffset( int o ) {
        off = o;
        update();
    }
};

メイン:

int main( int argc, char **argv) {
    QApplication app(argc, argv, true);
    Labels l;
    l.show();

    /* Animated the view */
    QPropertyAnimation *animation = new QPropertyAnimation(&l,"offset");
    animation->setLoopCount( -1 ); /* infinite loop */
    animation->setDuration(2000);
    animation->setStartValue(0.0);
    animation->setEndValue(200.0);
    animation->start();
    return app.exec();
}

最も難しいのは、最大オフセットを計算することです...

于 2013-03-01T15:52:47.760 に答える