![見出し画像](https://assets.st-note.com/production/uploads/images/68974244/rectangle_large_type_2_1f593f2757374cbd9a48c6f70e6cc4df.png?width=1200)
【Qt】バイナリ化したリソースファイルを複数プロジェクトで共有する方法
やりたいこと
画像ファイルはそのまま開けないようにバイナリ化したい
複数のプロジェクトで同じ画像ファイルを共用したい
Qtデザイナでの編集時に画像プレビューできるようにしたい
環境
Windows 10
Qt Creator 6.0.1
Qt 6.2.2 MinGW
リソースファイルプロジェクトを作成
リソースファイルを作成したいだけなので、空のqmakeプロジェクトを作成する。
![](https://assets.st-note.com/img/1641026343049-9Fu3Tg3RZW.png?width=1200)
プロジェクトを右クリックし、qrcファイルを追加する。
![](https://assets.st-note.com/img/1641026976657-rdazVRsJ2w.png)
![](https://assets.st-note.com/img/1641027007972-fG61oL18R2.png?width=1200)
出来上がったqrcファイルに画像を登録する。
![](https://assets.st-note.com/img/1641027209602-wI9pK5F1XL.png)
![](https://assets.st-note.com/img/1641027310296-mAt2o2KKn9.png)
リソースファイル変換
作成したqrcファイルをrccというファイルに変換する。
コマンドプロンプトなどでリソースファイルプロジェクトの場所まで移動し、以下のコマンドでリソースファイルの変換を行う。
C:\Qt\6.2.2\mingw_64\bin\rcc.exe -binary myimages.qrc -o myimages.rcc
※rcc.exeの場所は各自利用している環境に置き換えてください。
アプリケーションプロジェクトの作成
新たにアプリケーション用のプロジェクトを作成する。
![](https://assets.st-note.com/img/1641027621770-AZttikbnoE.png?width=1200)
![](https://assets.st-note.com/img/1641027691671-dXZNqFEIRN.png)
リソースファイルプロジェクトは開いたままにしておく。
この状態で、appプロジェクトでrccプロジェクト内にある画像を利用する。
![](https://assets.st-note.com/img/1641027837378-hiaBAXKEzW.png?width=1200)
この状態でQtデザイナを開くと以下のようにrccプロジェクトの画像がプレビューされる。これで、Qtデザイナを使って楽にGUI開発が行えるようになった。
※ロードされるまで少し時間がかかるかもしれない。表示されなかったら一度Qt Creatorを閉じて、再度rccプロジェクトとappプロジェクトを開く。
![](https://assets.st-note.com/img/1641028372924-oJf6ZJQFn1.png?width=1200)
ここまでの手順で開発は行えるが、このままではapp実行時に以下のようなエラーになる。
qrc:/main.qml:10:5: QML Image: Cannot open: qrc:/image/image.jpg
当然、画像は表示されない。
![](https://assets.st-note.com/img/1641029325035-AV3Ji3uulW.png?width=1200)
実行時に作成したrccファイルを読み込ませる必要があるので、以下のようにパスが通っているところにrccファイルをコピーしておく。
![](https://assets.st-note.com/img/1641028906639-6URnSmwliA.png?width=1200)
プログラム起動時に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://assets.st-note.com/img/1641029305275-0l3FqxFIRQ.png?width=1200)
参考サイト
https://doc.qt.io/qt-5/resources.html#external-binary-resources
この記事が気に入ったらサポートをしてみませんか?