Qt 5 Styling: динамически загружать файлы qml

В настоящее время я пытаюсь расширить наше приложение с другим стилем.
Для каждого стиля у меня есть отдельный файл qml, например определения цвета.
StyleA.qml:

import QtQuick 2.0
QtObject {
property color textColorStandard: 'black'
...
}

В моем main.qml я хотел бы загрузить правильный файл qml, основанный на свойстве программного обеспечения:

import QtQuick 2.0
Item {
id: mainPanel
....

Loader {
id: myDynamicStyle
source:  Property.UseThemeA? "StyleA.qml" : "StyleB.qml"}
...
Item {
id: BackGround
color: myDynamicStyle.textColorStandard
}
}

К сожалению, этот подход не работает. Есть ли другой / лучший способ выполнить стиль?

спасибо майкл

3

Решение

Использование вещей, загруженных в Loader, плохо напечатано, я бы предпочел:

Сначала создайте общий компонент-предок для всех моих стилей, например:

// AbstractStyle.qml
import QtQuick 2.0;
QtObject {
property color textColorStandard;
}

Затем создайте его для создания пользовательских стилей, например:

// StyleA.qml
import QtQuick 2.0;
AbstractStyle {
textColorStandard: "blue";
}

// StyleB.qml
import QtQuick 2.0;
AbstractStyle {
textColorStandard: "green";
}

Затем используйте строго типизированное свойство в моем объекте, которое должно использовать стиль, например:

// main.qml
import QtQuick 2.0
Item {
id: base;

Component { id: compoStyleA; StyleA { } }
Component { id: compoStyleB; StyleB { } }

property AbstractStyle currentStyle : {
var tmp = (Property.UseThemeA ? compoStyleA : compoStyleB); // choose component
return tmp.createObject (base); // instanciate it and return it
}

Rectangle {
color: currentStyle.textColorStandard;
}
}

Таким образом, есть несколько преимуществ:

  1. ваш код не использует строки для идентификации компонентов, поэтому ошибки легче найти и избежать;
  2. вы не можете повлиять на элемент, который не наследует ваш базовый класс стиля, поэтому вы не столкнетесь с ошибками «неопределенного свойства» и не будете нуждаться в ducktyping, чтобы выяснить, какая информация у вас есть в вашем объекте стиля;
  3. у вас нет Loader, так что вам не придется страдать от неприятной «изоляции контекста» внутри и снаружи Loader;
  4. все компоненты будут предварительно загружены во время выполнения, набирая скорость при реализации и позволяя с самого начала видеть, есть ли синтаксические ошибки в стилях, вместо того, чтобы видеть их только при изменении текущего стиля;
  5. И последнее, но не менее важное: автозаполнение свойства будет работать в QtCreator, поскольку фактический тип будет известен в IDE!
3

Другие решения

Вы пытались использовать это вместо этого? Загруженный объект сохраняется в свойстве item загрузчика, а не непосредственно в загрузчике.

Item {
id: BackGround
color: myDynamicStyle.item.textColorStandard
}
2

По вопросам рекламы [email protected]