Включить другой файл 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";
}
...
}