QQuickImage转换为QImage

时间:2014-08-16 02:35:43

标签: c++ qml qtquick2 qt5.3

我一直在使用QZXing来解码QR码,我的QML看起来像这样

Image{ 
    width:300
    height:300
    id:imageToDecode
    source:"qr.jpg"
    cache: true
}

当我将它传递给C ++文件时,它必须转换为QImage类型, 在原始编码器编写的代码中

QGraphicsItem *item = qobject_cast<QGraphicsItem*>(imageObj);

然后使用QGraphicsItem构造一个QImage,但是在转换后它总是返回0,因为QGraphicsItem不继承QObject

直接转换,如

QImage*item = qobject_cast<QImage*>(imageToDecode);

不会出于同样的原因,我一直在使用

imageObj->inherits("objectName");

测试哪一个可以转换为,但我找不到 我的观点是将QML图像转换为QImage。

2 个答案:

答案 0 :(得分:2)

如果您使用Qt5或更高版本以及QtQuick 2.0或更高版本,则无法将Image元素渲染为QGraphicsItem或与QGraphics相关的任何内容,因为从Qt5开始,QML的后端是scenegraph而不是QGraphics。 所以现在继续使用Qt5.3并且你如果在C ++中访问Image元素,它将在内部被转换为QQuickImage,但是你仍然无法从Image元素中提取图像,因为QQuickImage尚未公开。 参考。 http://qt-project.org/forums/viewthread/32767

他们现在提出的解决方案是使用QQuickImageProvider。

答案 1 :(得分:1)

我发现可能(或可能不是)解决此问题的方法。

在分配了预览源的Image中,我调用grabToImage()来创建QQuickItemGrabResult对象,然后在C ++中调用该对象上的image()函数。它似乎有效。

QML

Image {
  id:imageToDecode
  MouseArea {
    anchors.fill:parent
    onClicked: parent.grabToImage(function(result)
      decoder.decodeImageQML(result); })
    }
 }

C ++

QImage ImageHandler::extractQImage(QObject *imageObj,
                     const double offsetX, const double offsetY,
                     const double width, const double height)
{
    QQuickItemGrabResult *item = 0;
    item = qobject_cast<QQuickItemGrabResult*>(imageObj);
    QImage item_image(item->image());
    ....
}