在QML :: Image视图上更新多个QImages仅显示最后发送的

时间:2017-12-24 16:23:52

标签: qt qml qtquick2 qimage qtquickcontrols

我有Image qml组件来显示QImage。以下是QML代码。

代码:

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)
        }
    }

}

工作原理:
我有一个使用QQuickImageProvider的C ++类,每次都为QImage提供不同的ID。

这项技术基本上可行,如果我在用户选择某个按钮时更新单QImage s。我可以动态生成QImagemy_qimage_viewer上更新它。还能够根据用户的要求显示多个不同的图像。这证明我使用QQuickImageProvider的技术基本上是有效的。

什么不工作
,这就是出现问题的地方。当我随后发送许多 QImage时,就像其中50-60个都在for循环中一样,然后它不显示全部,但只显示最后一个发送更新< / em>!

我的目标是尝试播放50-60 QImage s,其间有一些毫秒差距使它们看起来像一个视频/动画。是Image组件不是为了这种用途而制作的吗?还是我做错了?

问题:
可能是我应该等待每个QImage显示完成才能更新下一个?如果丢失了怎么办呢?

是否有使用Image的应用显示多个QImage的应用示例,使其显示为视频或动画?

1 个答案:

答案 0 :(得分:1)

如果您使用for-loop时没有时间显示和更新图像,则应在每张图像之间留出一点时间。

假设图像的采集时间小于某个值,例如小于1/60秒,我们可以在适当的步骤中使用NumberAnimation设置:

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

#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

中找到完整的示例