我有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。我可以动态生成QImage
在my_qimage_viewer
上更新它。还能够根据用户的要求显示多个不同的图像。这证明我使用QQuickImageProvider
的技术基本上是有效的。
什么不工作
但,这就是出现问题的地方。当我随后发送许多 QImage
时,就像其中50-60个都在for循环中一样,然后它不显示全部,但只显示最后一个发送更新< / em>!
我的目标是尝试播放50-60 QImage
s,其间有一些毫秒差距使它们看起来像一个视频/动画。是Image组件不是为了这种用途而制作的吗?还是我做错了?
问题:
可能是我应该等待每个QImage
显示完成才能更新下一个?如果丢失了怎么办呢?
是否有使用Image的应用显示多个QImage
的应用示例,使其显示为视频或动画?
答案 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
中找到完整的示例