見出し画像

【Qt】バイナリ化したリソースファイルを複数プロジェクトで共有する方法

やりたいこと

  • 画像ファイルはそのまま開けないようにバイナリ化したい

  • 複数のプロジェクトで同じ画像ファイルを共用したい

  • Qtデザイナでの編集時に画像プレビューできるようにしたい

環境

  • Windows 10

  • Qt Creator 6.0.1

  • Qt 6.2.2 MinGW

リソースファイルプロジェクトを作成

リソースファイルを作成したいだけなので、空のqmakeプロジェクトを作成する。

プロジェクトを右クリックし、qrcファイルを追加する。

出来上がったqrcファイルに画像を登録する。

リソースファイル変換

作成したqrcファイルをrccというファイルに変換する。
コマンドプロンプトなどでリソースファイルプロジェクトの場所まで移動し、以下のコマンドでリソースファイルの変換を行う。

 C:\Qt\6.2.2\mingw_64\bin\rcc.exe -binary myimages.qrc -o myimages.rcc

※rcc.exeの場所は各自利用している環境に置き換えてください。

アプリケーションプロジェクトの作成

新たにアプリケーション用のプロジェクトを作成する。

リソースファイルプロジェクトは開いたままにしておく。
この状態で、appプロジェクトでrccプロジェクト内にある画像を利用する。

この状態でQtデザイナを開くと以下のようにrccプロジェクトの画像がプレビューされる。これで、Qtデザイナを使って楽にGUI開発が行えるようになった。

※ロードされるまで少し時間がかかるかもしれない。表示されなかったら一度Qt Creatorを閉じて、再度rccプロジェクトとappプロジェクトを開く。

ここまでの手順で開発は行えるが、このままではapp実行時に以下のようなエラーになる。

qrc:/main.qml:10:5: QML Image: Cannot open: qrc:/image/image.jpg

当然、画像は表示されない。

実行時に作成したrccファイルを読み込ませる必要があるので、以下のようにパスが通っているところにrccファイルをコピーしておく。

プログラム起動時にrccファイルを読み込むようにコードを編集する。
以下の様なコードをqmlロード前に挿入しておく。引数のパスはrccファイルをコピーした場所を指定すること。

    QResource::registerResource(qApp->applicationDirPath() + "/myimages.rcc");

今回は簡易的にmain.cppを編集しておく。

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QResource>

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QGuiApplication app(argc, argv);

    QResource::registerResource(qApp->applicationDirPath() + "/myimages.rcc");

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

これで、無事に画像が表示された。

参考サイト

https://doc.qt.io/qt-5/resources.html#external-binary-resources

この記事が気に入ったらサポートをしてみませんか?