3

我一直在用QZXing解码二维码,我的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 Image 转换为 QImage。

4

2 回答 2

2

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

他们目前提出的解决方案是使用 QQuickImageProvider。

于 2014-08-16T11:01:09.947 回答
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());
    ....
}
于 2015-03-16T20:09:00.933 回答