Spec-Zone.ru › Qt 5.12

Заявления import

Синтаксис заявления import

Заявление import позволяет клиентам указать движку, какие модули, JavaScript-ресурсы и каталоги компонентов используются в документе QML. Типы, которые могут использоваться в документе, зависят от импортированных модулей, ресурсов и каталогов.

Типы импорта

Существует три разных типа импортов. Каждый тип импорта имеет немного отличающийся синтаксис, и к разным типам импортов применяются различные семантики.

Импорты модулей (пространств имён)

Наиболее распространённый тип импорта — импорт модуля. Клиенты могут импортировать QML-модули, которые регистрируют типы QML-объектов и JavaScript-ресурсы в заданном пространстве имён.

Общий вид импорта модуля:

import <ModuleIdentifier> <Version.Number> [as <Qualifier>]
  • <ModuleIdentifier> — это идентификатор, указанный в обозначении URI с точками, который однозначно идентифицирует пространство имён типов, предоставляемое модулем.
  • <Version.Number> — это версия вида MajorVersion.MinorVersion, которая определяет, какие определения различных типов объектов и JavaScript-ресурсов будут доступны из-за импорта.
  • <Qualifier> — это необязательный локальный идентификатор пространства имён, в который будут установлены типы объектов и JavaScript-ресурсы, предоставляемые модулем, если он задан. Если он опущен, типы объектов и JavaScript-ресурсы, предоставляемые модулем, будут установлены в глобальное пространство имён.

Пример импорта модуля без квалификатора:

import QtQuick 2.0

Этот импорт позволяет использовать все типы, предоставляемые модулем QtQuick, без необходимости указывать квалификатор. Например, следующий код клиента создаёт прямоугольник:

import QtQuick 2.0

Rectangle {
    width: 200
    height: 100
    color: "red"
}

Пример импорта модуля с квалификатором:

import QtQuick 2.0 as Quick

Этот импорт позволяет импортировать одновременно несколько модулей, предоставляющих конфликтующие имена типов, однако поскольку каждое использование типа, предоставляемого модулем, импортированным в квалифицированное пространство имён, должно предваряться квалификатором, движок QML может однозначно разрешить конфликт.

Пример кода клиента, создающего прямоугольник после использования квалифицированного импорта модуля:

import QtQuick 2.0 as Quick

Quick.Rectangle {
    width: 200
    height: 100
    color: "red"
}

Дополнительную информацию об импорте с квалификатором см. в следующей секции о импорте в квалифицированное локальное пространство имён.

Обратите внимание, что если QML-документ не импортирует модуль, предоставляющий конкретный тип QML-объекта, но пытается использовать этот тип, произойдёт ошибка. Например, следующий QML-документ не импортирует QtQuick, и поэтому попытка использовать тип Rectangle завершится ошибкой:

Rectangle {
    width: 200
    height: 100
    color: "red"
}

В этом случае движок выведет ошибку и откажется от загрузки файла.

Импорты пространств имён, не являющихся модулями

Типы также могут быть зарегистрированы в пространствах имён непосредственно через различные функции регистрации в C++ (например, qmlRegisterType()). Типы, зарегистрированные в пространстве имён таким образом, могут импортироваться путём импорта пространства имён, как если бы идентификатор пространства имён был идентификатором модуля.

Это наиболее распространено в клиентских приложениях, которые определяют собственные типы QML-объектов в C++ и регистрируют их в системе типов QML вручную.

Импорт в квалифицированное локальное пространство имён

Заявление import может необязательно использовать ключевое слово as для указания того, что типы должны быть импортированы в определённое локальное пространство имён документа. Если пространство имён указано, любые ссылки на типы, предоставляемые импортом, должны предваряться квалификатором локального пространства имён.

Ниже модуль QtQuick импортируется в пространство имён "CoreItems". Теперь все ссылки на типы из модуля QtQuick должны предваряться именем CoreItems.

import QtQuick 2.0 as CoreItems

CoreItems.Rectangle {
    width: 100; height: 100

    CoreItems.Text { text: "Hello, world!" }

    // WRONG! No namespace prefix - the Text type won't be found
    Text { text: "Hello, world!" }
}

Пространство имён действует как идентификатор модуля в рамках файла. Пространство имён не становится атрибутом корневого объекта, к которому можно обратиться внешне, как это можно сделать со свойствами, сигналами и методами.

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

import QtQuick 2.0 as CoreItems
import "../textwidgets" as MyModule

CoreItems.Rectangle {
    width: 100; height: 100

    MyModule.Text { text: "Hello from my custom text item!" }
    CoreItems.Text { text: "Hello from Qt Quick!" }
}

Обратите внимание, что несколько модулей могут быть импортированы в одно и то же пространство имён, так же как несколько модулей могут быть импортированы в глобальное пространство имён. Например:

import QtQuick 2.0 as Project
import QtMultimedia 5.0 as Project

Project.Rectangle {
    width: 100; height: 50

    Project.Audio {
        source: "music.wav"
        autoPlay: true
    }
}

Импорты каталогов

Каталог, содержащий QML-документы, также может быть импортирован непосредственно в QML-документ. Это обеспечивает простой способ сегментации QML-типов в повторно используемые группы: каталоги на файловой системе.

Общий вид импорта каталога:

import "<DirectoryPath>" [as <Qualifier>]

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

Аналогичные семантики для <Qualifier> применяются к импортам каталогов, как и к импортам модулей; для получения дополнительной информации см. предыдущий раздел об импорте в квалифицированное локальное пространство имён.

Дополнительную информацию об импорте каталогов см. в подробной документации по импорту каталогов.

Импорты JavaScript-ресурсов

JavaScript-ресурсы могут быть импортированы непосредственно в QML-документ. Каждый JavaScript-ресурс должен иметь идентификатор, по которому к нему обращаются.

Общий вид импорта JavaScript-ресурса:

import "<JavaScriptFile>" as <Identifier>

Обратите внимание, что <Identifier> должен быть уникальным в пределах QML-документа, в отличие от квалификатора локального пространства имён, который может применяться к импортам модулей.

JavaScript-ресурсы из модулей

JavaScript-файлы могут предоставляться модулями путём добавления определений идентификаторов в файл qmldir, который определяет модуль.

Например, если модуль projects.MyQMLProject.MyFunctions определён с помощью файла qmldir, и установлен в путь QML-импорта:

module projects.MyQMLProject.MyFunctions
SystemFunctions 1.0 SystemFunctions.js
UserFunctions 1.0 UserFunctions.js

клиентское приложение может импортировать JavaScript-ресурсы, объявленные в модуле, импортировав модуль и использовав идентификатор, связанный с объявленным ресурсом:

import QtQuick 2.0
import projects.MyQMLProject.MyFunctions 1.0

Item {
    Component.onCompleted: { SystemFunctions.cleanUp(); }
}

Если модуль был импортирован в локальное пространство имён документа, идентификаторы JavaScript-ресурсов должны предваряться квалификатором пространства имён для использования:

import QtQuick 2.0
import projects.MyQMLProject.MyFunctions 1.0 as MyFuncs
import org.example.Functions 1.0 as TheirFuncs

Item {
    Component.onCompleted: {
        MyFuncs.SystemFunctions.cleanUp();
        TheirFuncs.SystemFunctions.shutdown();
    }
}
Дополнительная информация

Дополнительную информацию о JavaScript-ресурсах см. в документации о определении JavaScript-ресурсов в QML, а дополнительную информацию об импорте JavaScript-ресурсов и о том, как импорты могут использоваться изнутри JavaScript-ресурсов, см. в подробной документации об импорте JavaScript-ресурсов в QML.

Путь QML-импорта

При импорте идентифицированного модуля QML-движок ищет соответствующий модуль в пути импорта.

Этот путь импорта, возвращаемый функцией QQmlEngine::importPathList(), определяет стандартные места, которые движок ищет по умолчанию. По умолчанию этот список содержит:

  • Каталог текущего файла
  • Расположение, указанное в QLibraryInfo::Qml2ImportsPath
  • Пути, указанные в переменной среды QML2_IMPORT_PATH
  • Путь qrc:/qt-project.org/imports внутри ресурсов.

Дополнительные пути импорта можно добавить с помощью QQmlEngine::addImportPath() или переменной среды QML2_IMPORT_PATH. При запуске инструмента qmlscene можно также использовать опцию -I, чтобы добавить путь импорта.

Отладка

Переменная среды QML_IMPORT_TRACE может быть полезна при отладке, когда возникают проблемы с поиском и загрузкой модулей. Дополнительную информацию см. в разделе Отладка импортов модулей.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.12/qtqml-syntax-imports.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API