2017-12-24 24 views
0

QImageを表示するImage qmlコンポーネントがあります。以下はQMLのコードです。QML :: Imageビューで複数のQImagesを更新すると、最後に送信されたものだけが表示されます

コード:

Item { 

    Image { 
     id: my_qimage_viewer 
     anchors.fill: parent 
    } 

    Connections { 
     target: qimage_selector_cpp_backend 
     onQImageDisplayRequested: { 
      my_qimage_viewer.source = next_qimage_source 
      console.log("New qimage sent for display is : " + my_qimage_viewer.source) 
     } 
    } 

} 

働いているもの:
私は別のIDを持つたびにQImage Sを供給するQQuickImageProviderを使用してC++クラスを持っています。

このテクニック基本的には私はユーザーによっていくつかのボタンの選択時にQImageを更新します。私はQImageをオンザフライで生成することができます。& my_qimage_viewerに更新してください。また、ユーザからの要求に応じて複数の異なる画像を表示することもできる。これは、QQuickImageProviderを使った私のテクニックが基本的に動作していることを証明しています。問題が発生した場所
しかしが動作していない何

は、ここにあります。 多くの場合QImageを送信したとき、forループ内のすべてのものが50〜60のようにすべて表示されず、は更新のために最後に送信されたものだけを表示します

私の目的は、中間のギャップを持って50-60 QImageを再生して、をビデオ/アニメーションのように表示させることです。そのような種類の使用のためにImageコンポーネントが作られていないのですか?それとも私は間違いをしているのですか?

質問:
は、各QImageは、次の更新前に、完全に表示されるようにするために、私は待つべきことができますか?それが行方不明の場合、どうすればいいですか?

複数のQImageを表示してビデオやアニメーションのように見せるためのImageを使用するアプリの例はありますか?

+0

ANSWに見出すことができます画像を更新するかどうか、またはそれらを連続したものにするかどうか、つまり画像の読み込みが遅れているか、画像の作成や処理を行っていますか? – eyllanesc

+0

@eyllanesc Iすべての画像を連続して更新したい。はい。イメージの構築が遅れることがあります。しかし、処理された 'QImage'sで試す前に、私はまず、その場で作成された単純で単純な' 'QImage''を試してみることにしました。まずフレームワークが実際に動作することを証明することです。 [QML :: Image](https://doc-snapshots.qt.io/qt5-dev/qml-qtquick-image.html)に複数の 'QImage'を更新する標準的な例がありますか? –

答えて

1

for-loopを使用すると、画像を表示して更新する時間がないので、各画像の間に少し時間を置いてください。

Window { 
    visible: true 
    width: 640 
    height: 480 

    Image { 
     property int number 
     id: name 
     source: "image://numbers/"+number 

     NumberAnimation on number { 
      from:0 
      to: 60 
      duration: 1000 
     } 
    } 
} 

imageprovider.h:画像の取得時間が1/60秒未満、例えば、我々は適切なステップでNumberAnimation設定を使用することができ、一定値未満であると仮定すると

#ifndef IMAGEPROVIDER_H 
#define IMAGEPROVIDER_H 

#include <QQuickImageProvider> 
#include <QPainter> 
#include <QTime> 

class ImageProvider : public QQuickImageProvider 
{ 
public: 
    ImageProvider():QQuickImageProvider(QQuickImageProvider::Image){ 
     qsrand(QTime::currentTime().msec()); 
    } 
    QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize){ 
     int width = 100; 
     int height = 50; 
     if (size) 
      *size = QSize(width, height); 
     QImage img(requestedSize.width() > 0 ? requestedSize.width() : width, 
       requestedSize.height() > 0 ? requestedSize.height() : height, QImage::Format_RGB32); 
     img.fill(QColor(qrand() % 256, qrand() % 256, qrand() % 256)); 
     QPainter painter(&img); 
     painter.setRenderHint(QPainter::Antialiasing, true); 
     painter.drawText(QRectF(QPointF(0, 0), img.size()), Qt::AlignCenter, 
         QTime::currentTime().toString("hh:mm:ss.z")+" "+id); 
     painter.end(); 
     return img; 
    } 
}; 

#endif // IMAGEPROVIDER_H 

完全な例は、以下のlink

+0

この回答に感謝します。これは、複数のQImageの場合に 'QtQuickImageProvider'を使用するこの方法を理解するのに本当に役に立ちました –

関連する問題