一、概述
QQuickImageProvider用于在QML应用程序中提供高级图像的加载功能。(在c++中提供图像路径,编辑等底层数据交互逻辑,在qml端调用显示)它允许QML中的图像被:
- 使用QPixmaps加载,而不是实际的图像文件。
- 在一个单独的线程中异步加载。
二、具体用法
1、定义一个继承于QQuickImageProvider类的图像提供程序并实现,注意需要重写requestPixmap或函数requestImage
图像提供类的声明:
/*myimageproviter.h*/
#ifndef MYIMAGEPROVITER_H
#define MYIMAGEPROVITER_H
#include <QQuickImageProvider>
class MyImageProviter:public QQuickImageProvider //图像提供程序
{
public:
MyImageProviter() : QQuickImageProvider(QQuickImageProvider::Pixmap) //构造函数
{
}
QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize); //重写requestPixmap函数
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize); //重写requestImage函数
};
#endif // MYIMAGEPROVITER_H
图像提供类的实现:
/*myimageproviter.c*/
#include "myimageproviter.h"
#include <QPixmap>
#include <QCoreApplication>
#include <QPainter>
#include <QDebug>
//requestPixmap函数的重写,在qml中使用source加载图片时会自动调用requestPixmap或requestImage函数(根据图片类型不同),返回QPixmap或QImage对象
QPixmap MyImageProviter::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{
QString s=":/ima/" + id; //本地图片加载路径的拼接,根据id不同可以调用不同图片
QPixmap pix; //新建一个QPixmap对象
pix.load(s); //加载图片
pix=pix.scaled(150,250); //图片缩放
return pix; //返回QPixmap对象
}
QImage MyImageProviter::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{
QImage im;
im.load(":/ima/R-C.png");
return im;
}
2、使用QQmlEngine::addImageProvider 函数将图片提供类的对象(注册)到qml引擎中, 并且指定标识符, 该标识符在qml中使用。
/*main.cpp/*
QQmlApplicationEngine engine;
engine.addImageProvider("ima33",new MyImageProviter()); //将图像提供类注册到qml引擎中,在qml中标识符(名字)为"ima33"
//engine.addImageProvider("标识符",图片提供类对象);
3、在qml中调用加载图片
需要使用 source: “image://标识符/图片id” 的格式来加载
/*main.qml*/
Image { //Image图片控件
id: hhhhh
x:200
y:200
// width: 135
// height: 150
// sourceSize.width: 120
// sourceSize.height: 120
source: "image://ima33/R-C.png" //指定资源信息。会自动调用图片提供类的requestPixmap或requestImage函数,
//将id、QSize等信息传给requestPixmap或requestImage函数的形参,返回QPixmap或QImage对象,并自动把图片画出来(加载出来)
//source: "image://标识符/图片id"
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/282432.html