前言

开发Qt应用时,想把QImage发送到QML端通过Image组件显示出来,这种场景主要用在例如在C++端调用android系统接口截图然后发送到QML端显示,或者C++端QWidget截图然后让QML界面中显示。要想实现该功能,需要用到一个重要的类QQuickImageProvider,这是专门从C++端提供图片到QML显示的。

正文

先来看看Qt的示例

首先定义一个类并继承于QQuickImageProvider,然后重新实现接口requestPixmap,如果需要传入QImage图片的话就重写requestImage接口,原理是一样的,详情查看Qt官方文档。

class ColorImageProvider : public QQuickImageProvider{public:ColorImageProvider(): QQuickImageProvider(QQuickImageProvider::Pixmap){}QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize){int width = 100;int height = 50;if (size)*size = QSize(width, height);QPixmap pixmap(requestedSize.width() > 0 ? requestedSize.width() : width,requestedSize.height() > 0 ? requestedSize.height() : height);pixmap.fill(QColor(id).rgba());return pixmap;}};

然后在main函数中添加图片入口,使用addImageProvider函数

int main(int argc, char *argv[]){...QQuickView view;QQmlEngine *engine = view.engine();engine->addImageProvider(QLatin1String("colors"), new ColorPixmapProvider);...}

再在QML端界面上显示

Column {Image { source: "image://colors/yellow" }Image { source: "image://colors/red" }}

这里的colors就是main函数中定义的图片文件夹名称,yellow和red相当于id,也就是在requestPixmap中的第一个参数可以拿到这个值。编译运行后,得到如下示意图:

动态刷新图片

以上是显示一张静态图片,如果是要动态的刷新QML的图片要怎么办呢?接着看

class ImageProvider : public QQuickImageProvider
{
public:ImageProvider();QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);QImage img;};
#include "imageprovider.h"ImageProvider::ImageProvider(): QQuickImageProvider(QQuickImageProvider::Image)
{
}QImage ImageProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize)
{return this->img;
}QPixmap ImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{return QPixmap::fromImage(this->img);
}

然后再定义一个类

class ShowImage : public QObject
{Q_OBJECT
public:explicit ShowImage(QObject *parent = 0);ImageProvider *m_pImgProvider;
public slots:void setImage(QImage image);
signals:void callQmlRefeshImg();
};
ShowImage::ShowImage(QObject *parent) :QObject(parent)
{m_pImgProvider = new ImageProvider();
}
void ShowImage::setImage(QImage image)
{m_pImgProvider->img = image;emit callQmlRefeshImg();
}

然后在main函数中注册

ShowImage *CodeImage = new ShowImage(this);engine.rootContext()->setContextProperty("CodeImage",CodeImage);engine.addImageProvider(QLatin1String("CodeImg"), CodeImage->m_pImgProvider);

回到QML中调用

Image{id:imganchors.fill: parent}Connections{target: CodeImageonCallQmlRefeshImg:{img.source = ""img.source = "image://CodeImg"}}

注意,这里刷新图片的时候必须先设置为空img.source = “”,否则无法刷新。另外,我在Mac 上用 Qt5.11版本测试的时候,发现图片依然不能刷新,然后在 Image 属性加上一句:cache:false 就搞定了,不显示的原因是 Image 自动做了缓存,把缓存去掉就行了。
这样一来,C++端设置新图片后会发送信号,在QML端连接信号然后去图片目录下去取出来刷新当前控件。原理很简单,不再赘述。

添加了演示代码,在这里

Qt C++发送图片到QML显示相关推荐

  1. 04环信聊天界面 - 发送图片消息和显示图片

    1.在聊天控制器连线 /*** 点击上传图片*/ - (IBAction)showImgPickerAction:(UIButton *)sender {// 图片选择控制器UIImagePicker ...

  2. Qt解决dib图片无法正常显示

    Qt中可显示的图像类型:BMP.GIF.JPG.JPEG.PNG.TIFF.PBM.PGM.PPM.XBM.XPM. 使用其它格式的图片,打开可能是空白的.我在项目中就遇到了打开dib文件时,无法显示 ...

  3. qt客户端显示服务器发送的图片不显示,使用Qt将一系列图片通过网络发送到客户端动态显示...

    <使用Qt将一系列图片通过网络发送到客户端动态显示>由会员分享,可在线阅读,更多相关<使用Qt将一系列图片通过网络发送到客户端动态显示(8页珍藏版)>请在人人文库网上搜索. 1 ...

  4. Qt - 聊天室发送图片/文件

    Qt - 聊天室发送图片/文件 简介 好久没有发博客,上一篇的博客还是在上一份工作离职前整理的一篇博客.大半年没有发,一是工作繁忙,转成了音视频方向,新的工作内容暂时还不便发出来,二是不知道发什么内容 ...

  5. Qt 实现QT控件中的QLabel显示图片并自适应显示

    一.需求 实现QT控件中的QLabel显示图片,并自适应显示. 二.代码 QImage Image; Image.load(":/image/image/logo.jpg"); Q ...

  6. 串口发送图片VGA显示

    做fpga的图像处理,发送图片是比较简单的一步.使用ram结合串口及vga显示部分就可以很好的实现此功能. 实验目标: 使用uart发送大小为100*100的图片到vga显示屏幕上 实现思路: 十六位 ...

  7. Qt 图片 等比例显示、放大、缩小、平移图像 显示

    功能 初始加载图片,对任意大小图片,显示固定尺寸的缩略图 按住ctrl +滚轮:缩放 按住鼠标拖动图片 双击还原图片大小 实时显示鼠标所指像素的rgb 头文件 #pragma once #includ ...

  8. Qt项目背景图片无法显示

    问题描述: Qt加入背景图片,可运行时背景图片无法显示 这是Qt Designer中的界面,而在运行后背景是一片空白. 原因分析 我开始以为是我的qss代码出错了.当然代码开始也有一点问题,我没有把图 ...

  9. 二值化图片数据解码显示(Grayscale8、Grayscale16、RGB888)————附带Qt版完整代码

    文章目录 1 效果 2 思路 3 实现代码 4 扩展 4.1 RGB888 4.2 Grayscale16 5 实验数据 1 效果 显示效果: 二值化后的图片数据: 原始数据信息: \x00\x1F\ ...

最新文章

  1. python编程题-python编程练习题
  2. 收藏:flex/flash
  3. 为什么越来越多员工反感公司办年会?
  4. mysql 6.2 安装教程_CentOS 6.2 安装 MySQL 5.7.28的教程(mysql 笔记)
  5. 简单数据查询——单表无条件和有条件查询
  6. vivado2018.3代码编辑界面个性化定制方案
  7. PC电脑版微信聊天记录迁移方法
  8. 机器学习的应用–大数据
  9. wps下一页 很好玩!wps中怎么插入欧姆符号
  10. 网络和浏览器相关笔记
  11. python exec 函数_Python之浅谈exec函数
  12. 计算机互联网职业高中排名,职业高中有哪些热门专业可选择
  13. 数据分析之数据相关性分析
  14. [算法学习no7]图的遍历
  15. 小尺寸android 手机推荐,喜欢小屏安卓手机的来看看,这三款便宜又好用
  16. 数据结构练习题――Hero In Maze 简单版
  17. C_TFIN52_67 - SAP PA认证考试真题 Financial Accounting with SAP ERP
  18. Linux 电池 驱动
  19. 南方电网要的计算机二级吗,考南方电网需要过计算机二级和英语四级么
  20. php的按钮submit,html5中submit是按钮么

热门文章

  1. 负样本修正:CVR预估时间延迟问题
  2. 经信局推荐 | 网易智慧企业多产品入选《杭州市支持企业远程办公助力复工防疫产品和服务目录》!...
  3. 活动 | 5G万物智联下互联网通信技术升级之路
  4. 不就是发个短信吗?这你都会?
  5. 【视频】云信CTO阙杭宁:IM云开发经验分享
  6. LeetCode_每日一题今日份_329.矩阵中的最长递增路径(没懂)
  7. iOS12-Swift5-Date转化为String:DateFormatter
  8. 构造代码块会想你所想
  9. R 调用 python
  10. Jenkisn之JDK-MVN-ANT-GRADLE