Я использовал 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 Image в QImage.
Если вы используете Qt5 или выше и QtQuick 2.0 или выше, вы не можете визуализировать элемент Image в QGraphicsItem или что-либо, связанное с QGraphics, поскольку в Qt5 бэкэнд для QML — это scenegraph, а не QGraphics.
Так что теперь перейдем к Qt5.3, и если вы получите доступ к элементу Image в C ++, он будет приведен к внутреннему QQuickImage, но вы все равно не сможете извлечь изображение из элемента Image, поскольку QQuickImage еще не был обнародован.
Ссылка http://qt-project.org/forums/viewthread/32767
Решение, которое они предложили на данный момент, заключается в использовании QQuickImageProvider.
Я нашел что-то, что может (или не может) быть решением этой проблемы.
В изображении, которому назначен источник предварительного просмотра, я вызываю grabToImage () для создания объекта QQuickItemGrabResult, а затем в C ++ я вызываю функцию image () для этого объекта. Вроде работает.
Image {
id:imageToDecode
MouseArea {
anchors.fill:parent
onClicked: parent.grabToImage(function(result)
decoder.decodeImageQML(result); })
}
}
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());
....
}