web-dev-qa-db-ja.com

QMLファイルから別のQMLファイルを含める

この問題に関してStackoverflowには別の質問がありますが、受け入れられる解決策はありません。古い質問が注目されていないので、もう一度質問します。

状況はこうです。 「main.qml」、「feature1.qml」、「feature2.qml」で定義されたアプリケーション画面があります。

これらの画面は、タイトルバーの下に同じツールバーを共有しています。ツールバーには複数の項目があるため、QMLコードをコピーして貼り付けるのはおかしいです。この質問: QMLファイルインクルード-または1つのモノリシックファイル(構造QMLコード)? は、コンポーネント名としてQMLファイル名を使用することは可能であるが、動作しないことを示しています。

解決策はありますか?詳細plsで。

24
jondinham

main.qmlというファイルと、MyCustomText.qmlという別のファイルのコンポーネントがあると仮定します。両方のファイルが同じディレクトリにある場合、次のようにコンポーネントを直接ロードできます。

// in Main.qml
Rectangle {
  id: root
  MyCustomText {
    text: "This is my custom text element"
  }
}

MyCustomText.qmlが別のサブディレクトリMyComponentsにあり、たとえばすべてのカスタムコンポーネントをグループ化する場合、コンポーネントを同じ方法で使用する前に、最初にimportディレクトリを作成する必要があります。

// in Main.qml
import "MyComponents"

Rectangle {
  id: root
  MyCustomText {
    text: "This is my custom text element"
  }
}

注意すべきもう1つの重要な点は、QMLファイルが常に大文字で始まるである必要があることです。

もちろんLoaderソリューションも機能しますが、これはQMLファイルを他のコンポーネントにインポートする最も簡単な方法です。

35
koopajah

最後に、インターネットから探し出した。含まれるファイルが、このディレクトリ構造内の「mycomponent.qml」であるとします(Qt Quick):

projectdir/
  qml/
    projectname/
      main.qml
      mycomponent.qml

「mycomponent.qml」のコンテンツ(例):

Text {
  text:"Hello, Scooby Doo!";
}

この方法で(「main.qml」で)ロードする必要があります。

Rectangle {
  ...
  Loader {
    source:"mycomponent.qml";
  }
  ...
}
5
jondinham