web-dev-qa-db-fra.com

Inclure un autre fichier QML à partir d'un fichier QML

Il y a une autre question sur Stackoverflow à ce sujet mais je ne trouve pas la solution acceptée possible. Je pose donc à nouveau la question parce que la vieille question est hors de propos.

La situation est ainsi. J'ai des écrans d'application définis par 'main.qml', 'feature1.qml', 'feature2.qml'.

Ces écrans partagent la même barre d'outils sous la barre de titre. La barre d'outils a plusieurs éléments, donc copier-coller le code QML est comme un fou. Cette question: le fichier QML inclut - ou un fichier monolithique (structure du code QML)? dit qu'il est possible d'utiliser simplement le nom de fichier QML comme nom de composant mais je ne peux pas le faire fonctionner.

Toute solution? avec des détails pls.

24
jondinham

Supposons que vous ayez un fichier appelé main.qml et un composant dans un autre fichier appelé MyCustomText.qml. Si les deux fichiers sont dans le même répertoire, vous pouvez directement charger le composant comme ceci:

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

Si MyCustomText.qml est dans un autre sous-répertoire MyComponents par exemple pour regrouper tous vos composants personnalisés, vous devez d'abord import le répertoire avant d'utiliser le composant de la même manière:

// in Main.qml
import "MyComponents"

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

Une autre chose importante à noter est que vos fichiers QML doivent toujours commencer par une lettre majuscule si vous voulez pouvoir les utiliser de cette façon

Bien sûr, votre solution Loader fonctionne aussi mais c'est le moyen le plus simple d'importer des fichiers QML dans d'autres composants.

35
koopajah

Enfin, je l'ai creusé sur Internet. Disons que le fichier à inclure est 'mycomponent.qml' dans cette structure de répertoires (Qt Quick):

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

Le contenu de 'mycomponent.qml' (par exemple):

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

Nous devons le charger de cette façon (dans 'main.qml'):

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

Voir la documentation Qt sur les composants réutilisables.

Le fichier QML importé définit un type dont le nom est le même que le nom de fichier (en majuscule, moins le suffixe .qml). QML appelle le type un composant réutilisable. Vous utilisez ce nom de type pour instancier un objet dans le document QML importateur (fichier.)

Ce n'est pas comme un langage C, où le texte du fichier inclus est inséré dans le fichier inclus. C'est plus comme importer le nom d'une classe en Python, puis instancier un objet de cette classe dans le fichier d'importation. Ou quelque peu similaire à Javascript, le fichier importé crée un objet prototype et le fichier importateur en hérite de manière prototypique. Sauf notez la discussion sur l'objet racine et quelles propriétés du composant seront visibles (en raison de la portée du document QML.) Vous ne pourrez pas accéder à tout dans le fichier importé comme s'il s'agissait d'un C include, d'un Python import, ou un héritage JS.

2
bootchk

Vous pouvez simplement appeler le nom du qml. par ex. J'ai 2 fichiers qml. Les fichiers main.qml et Merchant.qml

Je viens d'appeler le marchand. il faut le montrer dans intellisense.

ApplicationWindow {
id: mainWindow
visible: true
Component{
    id: merchantsComponent
    Merchant{
        id: merchants
        width: mainWindow.width
        height: mainWindow.height
    }
}

}

Vous pouvez simplement appeler ce composant vers Loader

0