版权声明:本文为博主原创文章,未经博主允许不得转载。
本节最终解决为qml文件中的Image元素提供QImage类型的图片。利用到的类即QQuickImageProvider
最终需要提供的Image元素在main.qml文件中如下:
- Image {
- id: screenImg
- }
- Connections {
- target: client // 目标对象
- onCallQmlRefeshImg: {//连接自定义类Client来的信号,表示要刷新图片
- screenImg.source=""//更新图片
- screenImg.source= "image://screen"//image:必须
- }
Image {
id: screenImg
}
Connections {
target: client // 目标对象
onCallQmlRefeshImg: {//连接自定义类Client来的信号,表示要刷新图片
screenImg.source=""//更新图片
screenImg.source= "image://screen"//image:必须
}
在main中为我们的“screen”注册:
- int main(int argc, char *argv[])
- {
- QGuiApplication app(argc, argv);
- Client *client=new Client;
- QtQuick2ApplicationViewer viewer;
- viewer.engine()->rootContext()->setContextProperty("client", client); // 将新的类映射为QML的一个对象,c++交互
- viewer.engine()->addImageProvider(QLatin1String("screen"), client->imgProvider);//这句一个要在下一句之前,为引擎添加图片提供
- viewer.setMainQmlFile(QStringLiteral("qml/remoteContralClient/main.qml"));
- viewer.showExpanded();
- return app.exec();
- }
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
Client *client=new Client;
QtQuick2ApplicationViewer viewer;
viewer.engine()->rootContext()->setContextProperty("client", client); // 将新的类映射为QML的一个对象,c++交互
viewer.engine()->addImageProvider(QLatin1String("screen"), client->imgProvider);//这句一个要在下一句之前,为引擎添加图片提供
viewer.setMainQmlFile(QStringLiteral("qml/remoteContralClient/main.qml"));
viewer.showExpanded();
return app.exec();
}
screenImageProvider.h图片提供类:
- #ifndef SCREENIMAGEPROVIDER_H
- #define SCREENIMAGEPROVIDER_H
- #include <QQuickImageProvider>
- #include <QImage>
- #include <QSize>
- #include <QColor>
- class ScreenImageProvider : public QQuickImageProvider
- {
- public:
- ScreenImageProvider()
- : QQuickImageProvider(QQuickImageProvider::Image)
- {
- }
- QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize)//这个是自动调用的。路径"image://screen",如需要使用id等参数,如"image://screen/id"等
- {
- return this->img;
- }
- QImage img;
- };
- #endif // SCREENIMAGEPROVIDER_H
#ifndef SCREENIMAGEPROVIDER_H
#define SCREENIMAGEPROVIDER_H
#include <QQuickImageProvider>
#include <QImage>
#include <QSize>
#include <QColor>
class ScreenImageProvider : public QQuickImageProvider
{
public:
ScreenImageProvider()
: QQuickImageProvider(QQuickImageProvider::Image)
{
}
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize)//这个是自动调用的。路径"image://screen",如需要使用id等参数,如"image://screen/id"等
{
return this->img;
}
QImage img;
};
#endif // SCREENIMAGEPROVIDER_H
在Client中为ScreenImageProvider 中的img添加图片
- class Client : public QObject
- {
- Q_OBJECT
- public:
- explicit Client(QObject *parent = 0);
- ScreenImageProvider *imgProvider;
- signals:
- void callQmlRefeshImg();
- private:
- QImage img;
- }
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QObject *parent = 0);
ScreenImageProvider *imgProvider;
signals:
void callQmlRefeshImg();
private:
QImage img;
}
Client实现部分某地方:
- QByteArray a;
- in>>a;//in是一个datastream,从网络中获取了图片。
- img.QImage::loadFromData(a);
- imgProvider->img=img;//将图片传输给imgProvider类的img
- emit callQmlRefeshImg();//告诉qml要刷新图片
QByteArray a;
in>>a;//in是一个datastream,从网络中获取了图片。
img.QImage::loadFromData(a);
imgProvider->img=img;//将图片传输给imgProvider类的img
emit callQmlRefeshImg();//告诉qml要刷新图片
除可以提供QImage外,同理。还可以是QPixmap