一、概述
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/282432.html