I have built a static Qt library and want to use it deploy my app with a standalone exe. After one day effort, I have known that the qtquick plugin can not be static include into exe.
I need copy some folders in qml
folder to my exe directory to let the exe can show GUI.
So I want to know which file my exe need, I deleted files in those folders one by one to get it known. The real needed file is just a plugins.QMLTYPES
file and a qmldir
file.
And then I found the import path of QQmlApplicationEngine
can be changed, I output the QQmlApplicationEngine.importPathList()
and one of paths is just the qml
folder in Qt installed path. So I think this is the place where Qt get the search path of plugins.QMLTYPES
file and qmldir
file.
If all I think is correct, I can just copy the folders I need into qrc
file and use QQmlApplicationEngine.addImportPath("qrc:/foldersIwant")
to let exe can import what it need on runtime. And because qrc
is compiled into exe, I can get rid of those folders and let my exe standalone.
But after I do this in my code, app still can not find the files it need even the output of QQmlApplicationEngine.importPathList()
has the path I put into and I have also checked my path according to Load qmldir from QRC file.
Here is the code:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.addImportPath(QStringLiteral("qrc:/import/qtquick/"));
qDebug()<<engine.importPathList();
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
}
Here is a part of my qrc file
Is there anything wrong in my deductive?
Further research:
I have add
engine.addImportPath(QDir::currentPath() + QDir::separator() + "custom");
and move all folders into custom
folders, it can run successfully. And the exe which doesn't have this line can not run with custom
folder. So I'm wondering the "search" behavior can not be applied to qrc
file ?