Edited at

C++からQMLへ画像を表示させる

そのなんだ、自分が馬鹿すぎて、これを理解するのに3時間ほどかかったので、供養に置いておきます。

Qtバージョンは、5.13.0です。


C++からQMLへ画像を表示させる処理

まずは、C++から画像を指定できるようにする処理を載せていく。


mainwindow.cpp


// QMLへ"imagedata"という名前で送れるようにする
ui->image1->engine()->addImageProvider(QLatin1String("imagedata"),new ImageProvider);
// QMLファイルがここにあるよーと書いておく
ui->image1->setSource(QUrl::fromLocalFile("image1.qml"));



mainwindow.h


#include <QQuickImageProvider>
QT_BEGIN_NAMESPACE
class ImageProvider : public QQuickImageProvider
{
public:
ImageProvider() :QQuickImageProvider(QQuickImageProvider::Image){}
virtual QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize){
QImage o("./icon/image.png");
return o;
};

};



image1.qml


import QtQuick 2.0
Rectangle {
id: root
Image {
x: 0
source: "image://imagedata" ;
}
}


これでだけでおk。


QMLから注文が付けられるようにする

今回は、例として画像をQMLから自由に変えられるようにする。

mainwindow.cppは先ほどと同じ。


mainwindow.h


virtual QImage requestImage(const QString &id, QSize *size, const QSize& requestedSize){
QImage o("./icon/" + id);
return o;
};



image1.qml


import QtQuick 2.0
Rectangle {
id: root
Image {
x: 0
source: "image://imagedata/rucka trolley.png" ;
}
Image {
x: 32
source: "image://imagedata/tree.png" ;
}
}


"imagedata"の後に、文字を綴ると、requestImageの引数const QString &idとして使えるようになる。

requestImage内で、色々細工が可能。今回は、分かりやすいように"QMLから画像を注文する"という例にしてしまったが、この場合なら、下記の記述の方が100倍楽。


image.qml

import QtQuick 2.0

Rectangle {
Image {
source: "./icon/rucka trolley.png" ;
}
}