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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在QML :: Image视图上更新多个QImages仅显示最后发送的QImages相关的知识,希望对你有一定的参考价值。

我有Image qml组件来显示QImages。以下是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 ++类,每次都为QImages提供不同的ID。

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

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

我的目标是尝试玩50-60 QImages,两者之间有一些毫差距,使它们看起来像一个视频/动画。是不是Image组件不是为这种用途而制造的?还是我犯了一些错误?

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

是否有一个使用Image显示多个QImages的应用程序的示例,使其看起来像一个视频或动画?

答案

如果您使用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中找到

以上是关于在QML :: Image视图上更新多个QImages仅显示最后发送的QImages的主要内容,如果未能解决你的问题,请参考以下文章

使用多个视图在 QML 中查看、编辑和更新数据(来自 C++),而数据保留在 C++ 中(订阅数据)

QT以QImag显示图片并且以固定大小放缩后显示

在 QML 上异步更新多个 QQuickPaintedItem

如何正确使用 Qt QML Image Provider

如何使qml视图的特定区域透明

向 QAbstractListModel 子类添加新行时,QML 视图不会更新