【问题标题】:QQuickImage convert to QImageQQuickImage 转换为 QImage
【发布时间】:2014-08-16 02:35:43
【问题描述】:

我一直在用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。

【问题讨论】:

  • 您不能将 QGraphicsItem 转换为 QImage,因为它是非常不同的数据类型。我怀疑你有 QGraphicsPixmapItem ( QGraphicsItem 的继承者),所以你可以使用 QGraphicsPixmapItem::pixmap() 来获取你的图像(并将其转换为 QImage 之后)。
  • Qt Quick 的哪个版本,即。你在 qml import QtQuick x.x 中有什么版本?哪个版本的 Qt?只需添加相关标签。
  • 另外,你的 C++ sn-ps,它们是真正的代码吗?如果是,则说明这些imageObjimageToDecode 如何在C++ 中声明和初始化,即。它们是什么。
  • 我希望转换的方式就像
  • im 使用 QtQuick 2.2,Qt 5.3 版本,imageObj 是从 QML 传递过来的,这是一个 QML Image 项,传递的方式正是 qzxing 示例中的方式,我实际上可以用 C++ 得到这个项目,它看起来不错,唯一的问题是它被铸造后,它就消失了。 (item=0)

标签: c++ qml qtquick2 qt5.3


【解决方案1】:

如果您使用 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。

【讨论】:

  • 首先,感谢您的回答。是的,我看到了那个线程,我意识到这个对象是一个 QQuickImage,我无法从中提取任何东西。也许我不了解使用方式,但我认为 QQuickImageProvider 只能将图像从 C++ 提供给 QML,而不是返回的方式。无论如何,有什么解决方案可以将 QQuickImage 转换为 QImage?
  • ` QGraphicsItem *item = qobject_cast(imageObj); QImage img(item->boundingRect().size().toSize(), QImage::Format_RGB32); img.fill(QColor(255, 255, 255).rgb()); QPainter 画家(&img); QStyleOptionGraphicsItem 样式选项; item->paint(&painter, &styleOption);` 显然这是它用来构造 QImage 的方式,我想我现在需要重写这部分,只是不知道该怎么做
  • 正如我之前所说,没有办法,因为 QQuickImage API 不是公开的。如果您坚持使用 Qt Quick 2.0 或更高版本以及 Qt5,则无法将 Image 元素转换为 QGraphics*。
  • 是的,QQuickImageProvider 将图像从 C++ 提供给 QML,但无论如何你要回到 C++ 进行处理;)
【解决方案2】:

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

在分配了预览源的 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());
    ....
}

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多