MyTetra Share
Делитесь знаниями!
Создание собственных элементов в QML и импортирование одного файла в другой
Время создания: 16.01.2018 17:09
Текстовые метки: qml, элемент, в отдельном файле, импортирование, подключение, файл
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - QML - Краткая памятка по QML
Запись: xintrea/mytetra_syncro/master/base/1516111779ewl3evenn7/text.html на raw.github.com

В QML имеется возможность создавать собственные экранные элементы, и использовать их как элементы встроенных QML-типов. Для этого нужно просто создать файл с именем, начинающимся с большой буквы, и разрешением *.qml. Внутри файла надо прописать основной элемент (обычно с типом Item, но может быть и что-нибудь другое, например Rectangle) и наполнить его нужными элементами.


Вот пример файла с именем GameArea.qml. Соответственно, тип элемента будет называться GameArea, хоть нигде непосредственно в QML-коде это не прописывается:



import QtQuick 2.0


Item {

property string aboutText: "This is super game"

property color fieldColor: "blue"


width: (parent.width/2)*0.8

height: (parent.width/2)*0.8


Rectangle {

anchors.fill: parent

color: fieldColor


Text {

anchors.horizontalCenter: parent.horizontalCenter

anchors.verticalCenter: parent.verticalCenter

text: aboutText

}

}

}



Если qml-файл с новым типом элемента находится в том же каталоге, что и файл, из которого происходит вызов, то чтобы начать пользоваться данным типом, нужно просто начать этим типом пользоваться. Никаких директив подключения import писать не требуется. То есть, просто в основном *.qml-файле можно написать:



GameArea {

x: 0

y: 0

}



И элемент будет работать. Но если файл с новым типом находится в какой-нибудь поддиректории, то, чтобы его использовать, нужно прописывать импорт из данной поддиректории. Делается это так.


Предположим, что из файла main.qml нужно воспользоваться типом MyButton. Файл MyButton.qml находится в поддиректории elements. Тогда, в начале файла main.qml надо прописать:



import "./elements"



И все *.qml-файлы из директории elements будут подключены в текущем qml-файле. После чего в коде файла main.qml можно использовать тип MyButton.


Директива import способна так же импортировать файлы, расположенные в отдельном каталоге, в отдельное пространство имен, и таким образом подключаемые типы можно рассматривать как отдельный модуль.


Например, в поддиректории elements лежат файлы:


  • MyButton.qml
  • MyCheckBox.qml
  • MyRadioButton.qml


Тогда эти файлы можно подключить такой командой:



import "./elements" as MyElements



И при таком подключении использовать типы можно только через указание пространства имен, вот так:



MyElements.MyCheckBox {

text: "Enable network connect"

}



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


Внимание! Все *.qml-файлы и директории с *.qml-файлами нужно обязательно помещать в файл ресурсов. Иначе после компиляции (которая пройдет без ошибок) результирующий бинарник не будет иметь необходимый для его работы соответствующий QML-код. Об этом станет известно только в момент исполнения программы, и соответствующая ошибка будет выглядеть примерно так:


QQmlApplicationEngine failed to load component

qrc:/main.qml:3 "./elements": no such directory


Директива import - очень многофункциональная директива и имеет несколько вариантов использования. Подробности в официальной документации.



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования