一、QQuickImageProvider
需要重写QQuickImageProvider
class MemoryImage : public QQuickImageProvider {
public:
MemoryImage();
// QQuickImageProvider interface
public:
QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize) override;
private:
QImage m_image;
};
MemoryImage::MemoryImage()
: QQuickImageProvider(QQuickImageProvider::Image)
{
m_image.load("F:/IMG_20220519_183129_757.jpg");
}
QImage MemoryImage::requestImage(const QString& id, QSize* size, const QSize& requestedSize)
{
LOG_DEBUG() << id;
return m_image;
}
二、注册给qml engine
auto memoryImage = new MemoryImage();
engine.addImageProvider("MemoryImage", memoryImage);
qml即可通过"image://MemoryImage/id"进行访问内存 图片
这里的id就是 requestImage 里的ID。
注意一点,这里注册给engine的时候,不能使用普通对象或者智能指针,必须要使用指针,原因在于addImageProvider
内存会管理内存,有自动释放机制,看源码即可知道
void QQmlEngine::addImageProvider(const QString &providerId, QQmlImageProviderBase *provider)
{
Q_D(QQmlEngine);
QString providerIdLower = providerId.toLower();
QSharedPointer<QQmlImageProviderBase> sp(provider);
QMutexLocker locker(&d->mutex);
d->imageProviders.insert(std::move(providerIdLower), std::move(sp));
}
addImageProvider
将传进去的指针封装成智能指针,使用hash进行保存的,hash释放时就会自动释放provider