Connecting QQuickImageProvider
Connecting QQuickImageProvider
我必须将QQuickImageProvider与类连接起来,以传递图像提供者必须返回的图像,但我没有找到一种方法来做到这一点。
我有一个名为provedorImagem的类.cpp实现了虚拟请求Image函数,我还有一个名为processaImagem的类.cpp它是在图像上执行修改的类。
provedorImagem 类作为提供程序传递给 engine:engine.addImageProvider("provedor", provedorImg( in main.cpp
我需要的是一种将 main 中的提供程序中的插槽与 processaImagem.cpp 中的信号连接的方法.cpp。这样做 processaImagem.cpp 可以将我必须返回 Qml 的图像发送到 provedorImagem.cpp并将其发送回 Qml。
有人可以帮助我吗?
下面的代码
主.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "processaimagem.h"
#include "provedorimagem.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<processaImagem>("ProcessaImagemQml", 1, 0, "ProcessaImagem");
QQmlApplicationEngine engine;
provedorImagem *provedorImg = new provedorImagem;
//------------ I have to create a connection here between the provider slot and a signal in processaImagem with the image to provide -----------------
engine.addImageProvider("provedor", provedorImg);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
processaImagem.h
#ifndef PROCESSAIMAGEM_H
#define PROCESSAIMAGEM_H
#include <QObject>
#include <QImage>
#include <QQmlEngine>
#include <QQmlContext>
#include <QQuickImageProvider>
#include "provedorimagem.h"
class processaImagem : public QObject
{
Q_OBJECT
public slots:
QString recebeImagem(const QString &caminho);
public:
processaImagem(QObject *parent = 0);
QImage carregaImagem(const QString &caminho);
signals:
void enviaImagem(QImage);
};
#endif // PROCESSAIMAGEM_H
processaImagem.cpp
#include "processaimagem.h"
#include <QDebug>
processaImagem::processaImagem(QObject *parent)
{
}
QString processaImagem::recebeImagem(const QString &caminho)
{
QImage imagem = this->carregaImagem(caminho);
QString caminhoRetorno;
if(imagem.isNull())
{
qDebug() << "Erro ao receber a imagem";
}
else
{
qDebug() << "Imagem recebida";
caminhoRetorno = "image://provedor/imagemEditada";
}
return caminhoRetorno;
}
QImage processaImagem::carregaImagem(const QString &caminho)
{
QUrl caminhoImagem(caminho);
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
QQmlImageProviderBase *imageProviderBase = engine->imageProvider(caminhoImagem.host());
QQuickImageProvider *imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QSize imageSize;
QString imageId = caminhoImagem.path().remove(0, 1);
QImage imagem = imageProvider->requestImage(imageId, &imageSize, imageSize);
if(imagem.isNull())
{
qDebug() << "Erro ao carregar a imagem";
imagem = QImage();
}
else
{
qDebug() << "Imagem carregada";
}
return imagem;
}
Provedorimagem.h
#ifndef PROVEDORIMAGEM_H
#define PROVEDORIMAGEM_H
#include <QImage>
#include <QQuickImageProvider>
class provedorImagem : public QQuickImageProvider
{
public:
provedorImagem();
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
void carregaImagem();
public slots:
void carregaImagem(QImage imagemRecebida);
private:
QImage imagem;
};
#endif // PROVEDORIMAGEM_H
Provedorimagem.cpp
#include "provedorimagem.h"
#include <QDebug>
provedorImagem::provedorImagem() : QQuickImageProvider(QQuickImageProvider::Image)
{
}
QImage provedorImagem::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
if(imagem.isNull())
{
qDebug() << "Erro ao prover a imagem";
}
else
{
qDebug() << "Imagem provida";
}
return imagem;
}
void provedorImagem::carregaImagem(QImage imagemRecebida)
{
imagem = imagemRecebida;
}
回答我自己的问题问题解决了。以下是逐步的解决方案:
1 - 创建一个继承自QQuickImageProvider
和QObject
的class
,并在其中创建一个Image
成员(QImage)
,即要提供的图像。
class provedorImagem : public QObject, public QQuickImageProvider
实现virtual requestImage
方法。这是将图像返回到 Qml 的方法
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize)
创建一个方法来加载提供程序的图像以返回
void provedorImagem::carregaImagem(QImage imagemRecebida)
{
imagem = imagemRecebida;
}
现在将其设置为 main.cpp
文件中的引擎图像提供程序
provedorImagem *provedorImg = new provedorImagem;
engine.rootContext()->setContextProperty("ProvedorImagem", provedorImg);
2 - 创建另一个继承自QObject
的class
。
class processaImagem : public QObject
在此类中,您必须实现一个方法,该方法将从提供程序获取图像camera
执行图像修改并返回修改后的图像。PS:p_caminhoImagem
是我在接收camera preview path
的processaImagem class
中创建的property
。
QImage processaImagem::carregaImagem()
{
QUrl caminhoImagem(p_caminhoImagem);
QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine();
QQmlImageProviderBase *imageProviderBase = engine->imageProvider(caminhoImagem.host());
QQuickImageProvider *imageProvider = static_cast<QQuickImageProvider*>(imageProviderBase);
QSize imageSize;
QString imageId = caminhoImagem.path().remove(0, 1);
QImage imagem = imageProvider->requestImage(imageId, &imageSize, imageSize);
if(imagem.isNull())
{
imagem = QImage();
}
else
{
//Perform the modifications
}
return imagem;
}
3 - 现在是主要部分。映像requestImage
提供程序方法必须从processaImagem class
接收修改后的图像才能将其提供给 QML。为此,QML 文件必须可以访问提供程序class pointer
,因此,在main.cpp
文件中,只需将指针作为property
提供给 QML
engine.rootContext()->setContextProperty("ProvedorImagem", provedorImg);
并将processaImagem class
注册为 QML 类型
qmlRegisterType<processaImagem>("ProcessaImagemQml", 1, 0, "ProcessaImagem");
现在我们将其链接到 QML 文件中
ProvedorImagem.carregaImagem(processaImagem.carregaImagem());
4 - 完成了。现在只需从提供商请求图像:
imagemPreview.source = "image://provedor/imagemEditada_" + camera.numeroImagem.toString();
您正在尝试从qt(c ++(代码发送图像以在qml中显示。请查看以下相机应用来源。 使用 QQuickPaintedItem 将相机图像传递给 qml。
https://github.com/econsysqtcam/qtcam.git
看看videostreaming.cpp/videostreaming.h及其与qml的连接。 希望有帮助
要使图像提供程序正常工作,需要实现以下方法之一:
virtual QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize);
virtual QPixmap requestPixmap(const QString &id, QSize *size, const QSize& requestedSize);
virtual QQuickTextureFactory *requestTexture(const QString &id, QSize *size, const QSize &requestedSize);
派生自上面的示例。
QImage provedorImagem::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
// the id has value like "imagemEditada" or the last word in URL
if(imagem.isNull())
{
qDebug() << "Erro ao prover a imagem";
}
else if (caminhoRetorno.endsWith(id, Qt::CaseInsensitive)) // that will be a check for id after "provedor"
{
qDebug() << "Imagem provida";
return imagem; // provide an image
}
return QImage(); // no match with id from url
}
你的QML代码应该有这样的内容:
Image {
// // //
source: "image://provedor/imagemEditada"
}
Qt文档中有一个很好的完整示例。
@GuiDupas,从您更正的问题来看,您似乎想识别所提供的图像。使用 QString::endsWith 检查 URL 中最后一个单词的方法当然是为了演示。
- 没有找到相关文章