объявить глобальное свойство в QML для других файлов QML

Я хочу объявить глобальное свойство в файле config и использовать его в других файлах. например, объявить mainbg in:

стиль.в QML:

property color mainbg: 'red'

и использовать его в других файлах QML (например,view.qml и main.qml). Как я могу это сделать?

6 ответов


используйте Синглтон QML.

пожалуйста, ссылка "подход 2" на на этой странице -- Уродливый QTBUG-34418 комментарии мои.

эти части вам нужны:

стиль.в QML

pragma Singleton
import QtQuick 2.0
QtObject {
    property color mainbg: 'red'
}

qmldir

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

# qmldir
singleton Style Style.qml

как ссылка

import QtQuick 2.0
import "."  // this is needed when referencing singleton object from same folder
Rectangle {
    color: Style.mainbg  // <- there it is!!!
    width: 240; height 160
}

этот подход доступен с Qt5.0. Вам нужна папка import оператор, даже если ссылка на синглтон QML в той же папке. Если это та же папка, используйте:import "." это ошибка, которую я задокументировал на странице qt-project (см. QTBUG-34418, синглеты требуют явного импорта загрузить файл qmldir).


В принципе, если вам не нужна привязка свойств (если значение является константой и не нужно будет уведомлять об изменении) , вы можете определить его в общей библиотеке Javascript, например:

// MyConstants.js
.pragma library
var mainbg = "red";

и используйте его в QML следующим образом:

import "MyConstants.js" as Constants

Rectangle {
     color: Constants.mainbg;
}

но плохая сторона этого : - нет сильного набора текста (JS действительно не знает о типах), поэтому вы можете поместить что-нибудь, даже если это не цвет. - а если вы измените mainbg элемент, используя его не уведомили о измените и сохраните старое значение

поэтому, если вам нужна проверка типа и привязка / изменение, просто объявите свое свойство как член корневого объекта в вас main.qml, и он будет доступен отовсюду в приложении QML, потому что свойство фактически будет непосредственно зарегистрировано в объекте контекста Qml, который является глобальным по определению.

надеюсь, что это помогает.


вы можете создать JS-файл и импортировать его во все файлы, которые должны использовать это свойство.

JS-файла:

//Note: you only need '.pragma library' if you are planning to
//change this variable from multiple qml files
.pragma library
var globalVariable = 20;

файл qml:

import "test.js" as Global

Rectangle {
  id: main
  width: 300; height: 400

  Component.onCompleted: {
    console.log( Global.globalVariable)
    //you can also change it
    Global.globalVariable = 5
  }
}

добавление некоторого вклада в ответ @pixelgrease, я нашел другой метод, который не требует относительного пути import ".", workarounding ошибка QTBUG-34418. Это полезно, особенно если у вас есть qmldir и одноэлементный класс в другом месте, чем файл qml, где используется одноэлементный. Метод требует определения правильного модуля внутри древовидной структуры: модуль затем решается путем добавления родительского пути модуля к движку QML с помощью QmlEngine::addImportPath(moduleParentPath). Для пример:

qml/
├── <ModuleName>/
│ ├── <ClassName>.qml
│ ├── qmldir

в Main.КПП тогда у вас есть:

QQmlApplicationEngine engine;
engine.addImportPath("qrc:/qml");    // Can be any directory
engine.load("qrc:/qml/main.qml");

если вы используете ресурсы, qml.qrc:

<RCC>
 <qresource prefix="/">
      (...)
 <file>qml/main.qml</file>
 <file>qml/MySingletons/MySingleton.qml</file>
 <file>qml/MySingletons/qmldir</file>
 </qresource>
</RCC>

в qmldir:

module MySingletons
singleton MySingleton 1.0 MySingleton.qml

в Main.qml или любой другой файл qml в другом каталоге:

import MySingletons 1.0

затем вы используете класс MySingleton, как обычно. Я приложил пример MySingletonWithModule.7z to bug QTBUG-34418 для справки.


добавьте это свойство в main, и вы можете получить к нему доступ в любом qml,это может быть неправильным способом, но это работает.

или если вы хотите сгруппировать свойство, добавьте их в qml включите этот qml в main и дайте id, теперь вы можете получить доступ к этому свойству, используя этот id

main.в QML

 Item{
 width:10
 height:10

 Model{
 id:globdldata
 }



 }

модель.в QML

Item {

property color mainbg: 'red'

}

вы можете использовать globdldata.mainbg везде


вы всегда можете создать новый объектный файл QML, содержащий свойства, которые вы хотите совместно использовать в файлах qml. Просто импортируйте его так же, как любой объект QML, и у вас есть доступ к свойствам. Теперь, если вы хотите иметь возможность изменять эти свойства и иметь общие изменения между экземплярами, все становится намного сложнее, и вы, скорее всего, захотите прибегнуть к какому-то решению с помощью .файлы JS библиотеки pragma. Если вы не хотите написать что-то вроде C++ альтернатива.