Qt模块化笔记之Qt_Quick——用QQuickImageProvider给Image组件添加图片



本节最终解决为qml文件中的Image元素提供QImage类型的图片。利用到的类即QQuickImageProvider

最终需要提供的Image元素在main.qml文件中如下:

  1. Image {  
  2.     id: screenImg  
  3. }  
  4. Connections {  
  5.         target: client  // 目标对象  
  6.         onCallQmlRefeshImg: {//连接自定义类Client来的信号,表示要刷新图片  
  7.             screenImg.source=""//更新图片  
  8.             screenImg.source= "image://screen"//image:必须  
  9.         }  
Image {
	id: screenImg
}
Connections {
        target: client  // 目标对象
        onCallQmlRefeshImg: {//连接自定义类Client来的信号,表示要刷新图片
            screenImg.source=""//更新图片
            screenImg.source= "image://screen"//image:必须
        }

在main中为我们的“screen”注册:

  1. int main(int argc, char *argv[])  
  2. {  
  3.     QGuiApplication app(argc, argv);  
  4.     Client *client=new Client;  
  5.     QtQuick2ApplicationViewer viewer;  
  6.     viewer.engine()->rootContext()->setContextProperty("client", client);  // 将新的类映射为QML的一个对象,c++交互  
  7.     viewer.engine()->addImageProvider(QLatin1String("screen"), client->imgProvider);//这句一个要在下一句之前,为引擎添加图片提供  
  8.     viewer.setMainQmlFile(QStringLiteral("qml/remoteContralClient/main.qml"));  
  9.     viewer.showExpanded();  
  10.     return app.exec();  
  11. }  
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图片提供类:

  1. #ifndef SCREENIMAGEPROVIDER_H  
  2. #define SCREENIMAGEPROVIDER_H  
  3. #include <QQuickImageProvider>  
  4. #include <QImage>  
  5. #include <QSize>  
  6. #include <QColor>  
  7. class ScreenImageProvider : public QQuickImageProvider  
  8. {  
  9. public:  
  10.     ScreenImageProvider()  
  11.         : QQuickImageProvider(QQuickImageProvider::Image)  
  12.     {  
  13.     }  
  14.   
  15.     QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize)//这个是自动调用的。路径"image://screen",如需要使用id等参数,如"image://screen/id"等  
  16.     {  
  17.         return this->img;  
  18.     }  
  19.     QImage img;  
  20. };  
  21. #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添加图片

  1. class Client : public QObject  
  2. {  
  3.     Q_OBJECT  
  4. public:  
  5.     explicit Client(QObject *parent = 0);  
  6.     ScreenImageProvider *imgProvider;  
  7. signals:  
  8.     void callQmlRefeshImg();  
  9. private:  
  10.     QImage img;  
  11. }  
class Client : public QObject
{
    Q_OBJECT
public:
    explicit Client(QObject *parent = 0);
    ScreenImageProvider *imgProvider;
signals:
    void callQmlRefeshImg();
private:
    QImage img;
}
Client实现部分某地方:
  1. QByteArray a;  
  2. in>>a;//in是一个datastream,从网络中获取了图片。  
  3. img.QImage::loadFromData(a);  
  4. imgProvider->img=img;//将图片传输给imgProvider类的img  
  5. emit callQmlRefeshImg();//告诉qml要刷新图片  
        QByteArray a;
        in>>a;//in是一个datastream,从网络中获取了图片。
        img.QImage::loadFromData(a);
        imgProvider->img=img;//将图片传输给imgProvider类的img
        emit callQmlRefeshImg();//告诉qml要刷新图片

除可以提供QImage外,同理。还可以是QPixmap

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用QQuickImageProvider可以将图片提供给QML的Image组件。以下是一个简单的示例代码: 在C++中: ```cpp // 创建一个QQuickImageProvider的子类 class MyImageProvider : public QQuickImageProvider { public: // 构造函数 MyImageProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) {} // 重写requestPixmap方法,提供图片 QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override { // 加载图片 QPixmap pixmap("path/to/image.png"); // 如果requestedSize不为空,则调整图片大小 if (requestedSize.isValid()) { pixmap = pixmap.scaled(requestedSize, Qt::KeepAspectRatio); } // 如果size不为空,则返回图片大小 if (size) { *size = pixmap.size(); } // 返回图片 return pixmap; } }; // 创建一个QGuiApplication QGuiApplication app(argc, argv); // 创建MyImageProvider对象 MyImageProvider imageProvider; // 注册imageProvider QQmlApplicationEngine engine; engine.addImageProvider(QLatin1String("myimageprovider"), &imageProvider); // 加载QML文件 engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; // 运行应用程序 return app.exec(); ``` 在Qml中: ```qml // 在Image对象中使用MyImageProvider提供的图片 Image { source: "image://myimageprovider/imageid" } ``` 在Qml中,使用`image://myimageprovider/imageid`的格式来访问MyImageProvider提供的图片。其中,`myimageprovider`是在C++中注册的Image Provider的名称,`imageid`是在`requestPixmap`方法中返回的ID。例如,在上面的示例中,如果`requestPixmap`方法返回`"imageid"`,则在Qml中使用`image://myimageprovider/imageid`来访问图片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值