Qt QMLのモジュールについて混乱しています。私はすべてのドキュメントを読みましたが、いくつかの基本的なアイデアを明確にしません。
多数のQMLファイルをディレクトリに配置し、qmldirファイルを追加して、特定されたモジュールを記述することができることを理解しています。これを実行してQML_IMPORT_PATHを調整すると、QtCreatorが満足し、インポートModuleName 1.0行の下線が止まります。
作成者は幸せですが、機能しません。モジュールがインストールされていません。私の質問は次のとおりです。
これらの質問はすべて申し訳ありませんが、これらのモジュールの基本は明確ではありません。 「モジュール」が単なるファイルの共有なのか、それともコンパイルされたユニットなのかわかりません。
助けてくれてありがとう。
私はあなたの質問に答えようとします:
engine->addImportPath()
を使用して追加したディレクトリモジュールがロードされないことにつながる可能性のあるものがたくさんあります。以下を確認できます。
module TestModule
である場合、モジュールのディレクトリ名はTestModule
でなければなりません。QML2_IMPORT_PATH
(名前に2
があることを確認してください)モジュールを含むディレクトリを指すenv変数をエクスポートします。リストにディレクトリを追加してプラグインを検索するQQmlEngine::addImportPath
メソッドもあります。ldd
コマンドで確認できます。QT_PLUGIN_PATH
ランタイム変数を設定すると、プラグインのロードに役立つ場合があります。プラグインのディレクトリ自体ではなく、プラグインのディレクトリを含むディレクトリを指す必要があります。QT_DEBUG_PLUGINS=1
およびQML_IMPORT_TRACE=1
環境変数をエクスポートしますこのリンクを読むこともできます: https://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html
私の場合(qrcリソースにすべてのQMLファイルがあります)、qmldirをリソースにも追加し、QQmlApplicationEngineのメソッドaddImportPath( "qrc:/")を呼び出しました。
私のmain.cppは次のようになります:
QQmlApplicationEngine engine;
engine.addImportPath("qrc:/");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
.proファイルの重要な部分は次のようになります。
RESOURCES += qml.qrc \
MyModule/mymodule.qrc
QML_IMPORT_PATH += $$PWD
私のqmldir:
module MyModule
MyItem 2.0 MyItem20.qml
MyItem 2.1 MyItem21.qml
私のqrc:
<RCC>
<qresource prefix="/MyModule">
<file>MyItem20.qml</file>
<file>MyItem21.qml</file>
<file>qmldir</file>
</qresource>
</RCC>
そして最後に私のmain.qml:
import QtQuick 2.5
import QtQuick.Window 2.2
import MyModule 2.0
Window {
visible: true
width: 640
height: 480
MyItem {
anchors.fill: parent
}
}
QtCreatorは喜んで(コンポーネントとインポートに下線を引かない)、モジュールがロードされます。お役に立てれば。
arxarian's answer -モジュールを統合するための最良の手法だと思う-に拡張したいが、コメントにそれらの考えを収めることができなかったので、ここに新しい答えがあります。
Qmlモジュールとその関連リソースはランタイムエンティティであり、アプリケーションリソースに含まれていない限り、実行可能ファイルに対して相対的な場所に個別に存在すると想定されることを最初に理解することが重要です。それらをリソースに含めることで、それらはまだランタイムエンティティですが、アプリケーションバイナリ内のqrc:/ルートパスの下に存在します。このモジュールの非表示は、展開後にモジュールを開いたり、プリコンパイルされたプラグインとして個別に展開したりする必要がない限り(つまり、動的にリンクされた図書館)。
arxarianの答え の重要な要素の説明は次のとおりです。
engine.addImportPath("qrc:/");
は、アプリケーションリソースストレージでqmlモジュールを探すようにエンジンに指示するために、qmlをロードする前にC++コードで必要です。RESOURCES += MyModule/mymodule.qrc
が必要です。QML_IMPORT_PATH += $$PWD
は、Qt Creatorにプロジェクトソースツリーのルートから始まるモジュールを探すように指示します。私の場合、モジュールディレクトリがそこから始まったため、これをサブディレクトリ(たとえば、「ui/modules」)に設定する必要がありました。インポートパスには、すべてのモジュールディレクトリの下にルートが含まれている必要があります。私が知る限り、この命令はQt Creatorのみを対象としており、IDE=ビルドには影響しません。そのため、#1が必要です。<qresource prefix="/MyModule">
は、アプリケーションリソースストレージのqrc:/ルートに関連するモジュールサブディレクトリを定義します。import MyModule <version>
ステートメントが成功するように設定されました。起動時に、エンジンはqrc:/の下のディレクトリにモジュールを配置し、そこにあるqmldirファイルを解析してモジュールを定義し、それらのエントリから名前とバージョンを確立します。うまくいけば、これは他の人が何が起こっているのかを理解するのに役立ち、私が何かを誤解したかどうか教えてください。
同様の問題には少し時間がかかったので、次の人の手間を省くためにここに投稿するだけです。
私の問題は、目に見えないキャラクターがモジュール名に潜入したことです。おそらくコピー&ペーストで。ここに私の問題:
エラー出力の例:
MyEngine failed to load component
qrc:/qml/main.qml:53 Type MyComponent unavailable
file:///Users/<pathToProject>/MyProject/qml/MyModule/MyComponent.qml:-1 No such file or directory
それはすべて正常に見え、表示されるパスは確かに正しいものです。それで何が悪いのでしょうか?
次に、そのパスをターミナルウィンドウにコピーします。
file:///Users/<pathToProject>/MyProject/qml/MyModule/<feff>MyComponent.qml
それがあります:
"<feff>"
Qmldirファイルでコンポーネント名を手動で再入力し、非表示の文字を効果的に削除することで問題を解決しました。