如何在C++端将多个QImage对象设置给QML的Image元素?

3

我在C++代码中的Qt应用程序中有一个QImage对象。

Image {
   id: my_image
   source: ""
}

我有一个QML Connections元素,其中我正在接收一张QImage图像。

Connections {
    target: qimage_supplier
    onNewQImage: {
        recalled_media_image.source = new_qimage_supplied
    }
}

问题:
是否可以将QImage对象设置为Image QML项的源? 如果按照上述方法进行,其中new_qimage_supplied实际上是从C++端发送的QImage,则会出现以下错误:

Error: Cannot assign QImage to QUrl

如何将QImage对象设置为Image QML元素?


我已经定义了自己的 QQuickImageProvider 派生类并覆盖了 requestImage,它也被调用了。但我不明白 Image 元素中的 source: 属性是如何设置的? - TheWaterProgrammer
图片改变了什么? - eyllanesc
1
我在我的QQuickImageProvider派生类中有一个void SetImage(QImage image),我从CPP端调用它,以便在某些处理可用时设置图像。 - TheWaterProgrammer
1
@eyllanesc,每次我在C++端获取到一个新的QImage对象,它的高度和宽度都相同,但内容完全不同。我想要做的就是在C++端将新的QImage对象设置到Image QML项上,每当我获取到一个新的QImage对象时。就这样。 - TheWaterProgrammer
1
看起来使用派生自QQuickImageProvider的类很不错,但是如何触发/手动启动对requestImage的调用呢? - TheWaterProgrammer
显示剩余2条评论
1个回答

2

这是一个简单而粗略的示例(不可复制和粘贴!)

// 在main.cpp中(缺少导入)

class MyImageProvider: public QQuickImageProvider
{
    QImage m_image;
public:
    MyImageProvider(QImage img)
        : QQuickImageProvider(QQuickImageProvider::Image)
        , m_image(img)
    {}

    QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override {
        qDebug() << m_image;
        return m_image;
    }
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;   
    engine.addImageProvider("myimg", new MyImageProvider(QImage("C:/.../image.png")));
    engine.load(QUrl(QStringLiteral("main.qml")));

    return app.exec();
}

// 在 main.qml 中

ApplicationWindow {
    id: rootWin
    width: 800; height: 600; visible: true

    Image {
        source: "image://myimg/1"
    }
}

源代码如下:

image://registeredNameOfImageProvider/potentialId

1
我如何触发调用 requestImage?我在 MyImageProvider 中有一种方法,可以在可用时设置新的 QImage。如果我能够以某种方式手动触发对 requestImage 的调用,那么问题就解决了。 - TheWaterProgrammer
1
问题是,据我所知,引擎会缓存图像。因此,您每次都需要更改“source”。从 source: "image://myimg/1" 更改为 source = "image://myimg/2" 等等,每当图像更改时。 - derM
我应该从哪里获取 id12 的值。这是在 requestImage 函数中需要重写的第一个参数 const QString &id 吗? - TheWaterProgrammer
在设置potentialId之后,是否有可能触发对requestImage的调用? - TheWaterProgrammer
id is always received as blank in requestImage - TheWaterProgrammer
每当您更改分配给“source”的字符串时,引擎将寻找新的图片。如果协议是“image”,它将在注册的图像提供程序中查找指定的第二部分(registeredNameOfImageProvidermyimg)。如果指定,则将字符串的第三部分(potentialId)作为&id的值传递给函数requestImage。如果未指定,则会传递一个空字符串。在我的函数中,id将被忽略,但您可以自由处理它并传递另一张图片... - derM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接