Connecting QQuickImageProvider

Connecting QQuickImageProvider

本文关键字:QQuickImageProvider Connecting      更新时间:2023-10-16

我必须将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 - 创建一个继承自QQuickImageProviderQObjectclass,并在其中创建一个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 - 创建另一个继承自QObjectclass

class processaImagem : public QObject

在此类中,您必须实现一个方法,该方法将从提供程序获取图像camera执行图像修改并返回修改后的图像。PS:p_caminhoImagem是我在接收camera preview pathprocessaImagem 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 中最后一个单词的方法当然是为了演示。

相关文章:
  • 没有找到相关文章