Включить другой файл QML из файла QML

Еще один вопрос о Stackoverflow по этому вопросу, но я не нашел приемлемого решения. Поэтому я снова спрашиваю, потому что старый вопрос не подлежит вниманию.

Ситуация такова. У меня есть экраны приложений, определенные "main.qml", "feature1.qml", "feature2.qml".

Эти экраны используют одну и ту же панель инструментов под заголовком. Панель инструментов имеет несколько элементов, поэтому копировать-вставлять код QML, как сумасшедший. Этот вопрос: QML файл включает в себя - или один монолитный файл (структура QML-кода)? говорит, что возможно просто использовать имя файла QML в качестве имени компонента, но я не могу его получить работа.

Любое решение? с подробной информацией.

Ответ 1

Предположим, что у вас есть файл с именем 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"
  }
}

Еще одна важная вещь: ваши файлы QML должны всегда начинаться с буквы верхнего регистра, если вы хотите использовать их таким образом

Конечно, ваше решение Loader тоже работает, но это самый простой способ импортировать файлы QML в другие компоненты.

Ответ 2

Наконец, я выкопал его из Интернета. Скажем, файл to-be-includes - это "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";
  }
  ...
}

Ответ 3

См. документацию Qt о повторно используемых компонентах.

Импортированный файл QML определяет тип, имя которого совпадает с именем файла (с заглавной буквы, без суффикса .qml). QML вызывает тип повторно используемого компонента. Это имя типа используется для создания экземпляра объекта в документе QML импорта (файл.)

Не похоже на язык C, где текст включенного файла вставляется в файл include. Это больше похоже на импортирование имени класса в Python, а затем создание экземпляра объекта этого класса в импортирующем файле. Или несколько похож на Javascript, импортируемый файл создает объект-прототип, а файл импорта прототипически наследуется от него. Кроме того, обратите внимание на дискуссию о корневом объекте и о том, какие свойства компонента будут видны (из-за облачности документа QML). Вы не сможете получить доступ ко всему в импортированном файле, как если бы это был C include, импорт Python, или наследование JS.

Ответ 4

Можно ли загрузить .ui загрузчиком?

что-то вроде того.

Rectangle {
  ...
  Loader {
    source:"myform.ui";
  }
  ...
}