Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

そのなんだ、自分が馬鹿すぎて、これを理解するのに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" ;
    }
}
papparappara
ガチのプログラミング初心者。先人たちのように素晴らしい記事やプログラムは書けないが、気長に頑張る
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away