Russian Qt Forum

Qt => Qt Quick => Тема начата: Yegor от Ноябрь 11, 2014, 22:20



Название: [РЕШЕНО] Внедрить константы внутрь QML документа из вне
Отправлено: Yegor от Ноябрь 11, 2014, 22:20
Здравствуйте, уважаемые форумчане!

Работаю в qt4.8.6

Есть QML документ - StartPage.qml. В нем имеется свойство caption.

Код:
import QtQuick 1.1

//Start Page item.
Item {
    property string caption: "Start Page Name"
    ...........
}

Структура документа не меняется, поэтому я его компилирую в состав .exe

Но нужно время от времени менять только значение свойства caption. Жестко.
Я хочу сделать отдельный qml файл - MyConstants.qml, в котором будут храниться значение этой константы. Файл буду редактировать вручную. Компилировать его в состав проекта не буду. Так удобнее.

Вопрос: как написать такой внешний QML файл с константой? И как импортировать его значение в StartPage.qml?


Название: Re: Внедрить константы внутрь QML документа из вне
Отправлено: kibsoft от Ноябрь 12, 2014, 10:03
Может есть смысл использовать QSettings? Сделать обертку в C++, добавить нужное свойство, пробросить в QML, а потом менять значение в конфигурационном ini файле.

P.S. в Qt Quick 2.x можно было бы использовать QML Settings.


Название: Re: Внедрить константы внутрь QML документа из вне
Отправлено: vregess от Ноябрь 12, 2014, 15:12
Если хочется сделать все только на стороне QML, то по идее сам файл можно положить рядом с приложением и импортировать как обычно.

Из документации Qt 4.8.5
Цитировать
QStringList QDeclarativeEngine::importPathList () const

By default, the list contains the directory of the application executable, paths specified in the QML_IMPORT_PATH environment variable, and the builtin ImportsPath from QLibraryInfo.

Или добавить свой путь импорта - QDeclarativeEngine::addImportPath().

А вместо qml файла можно использовать js:
Код
Javascript
// constants.js
.pragma library
var CAPTION = "My caption";
 

Код:
import QtQuick 1.1
import "constants.js" as Constants
//Start Page item.
Item {
    property string caption: Constants.CAPTION
    ...........
}


Название: Re: Внедрить константы внутрь QML документа из вне
Отправлено: Отражение луны от Ноябрь 12, 2014, 15:29
Отредактировал пост потому, что не сразу понял задачу. Если Вам нужны настройки - храните их в json в внешнем файле, данные из них подтягивайте при помощи XMLHttpRequest. Распарсить json и подставить данные будет не сложно.
В чем преимущество перед хранением в виде .qml  или .js? Прежде всего в том, что настройки можно будет загружать заново в ходе работы программы.


Название: Re: Внедрить константы внутрь QML документа из вне
Отправлено: Yegor от Ноябрь 13, 2014, 19:50
Самый простой способ - хранить константы в отдельном реальном .js
Я кладу его рядом с исполняемым.

Только вот проблема, при запуске программы, в окно ошибок выводится:
Код:
Script qrc:/сonstants.js unavailable
qrc:/SPConsts.js: File not found

То есть программа решает, что файл нужно загрузить из системы ресурсов (раз пишет qrc:/), а не из реальной файловой системы. Как в StartPage.qml указать, что подгружать constants.js нужно из файловой системы?


Название: Re: Внедрить константы внутрь QML документа из вне
Отправлено: vregess от Ноябрь 13, 2014, 20:16
То есть программа решает, что файл нужно загрузить из системы ресурсов (раз пишет qrc:/), а не из реальной файловой системы. Как в StartPage.qml указать, что подгружать constants.js нужно из файловой системы?

Попробуй добавить QCoreApplication::applicationDirPath() в QDeclarativeEngine::addImportPath().


Название: Re: Внедрить константы внутрь QML документа из
Отправлено: Yegor от Ноябрь 13, 2014, 20:46
Цитировать
Попробуй добавить QCoreApplication::applicationDirPath() в QDeclarativeEngine::addImportPath().
Попробовал. Все равно не помогает. Да и лишнее оно, такой путь и так по умолчанию есть (смотрел QDeclarativeEngine::importPathList()).

В доке нашел, что если нужно грузить файлы из файловой системы, то нужно указывать префикс file:/
Но в таком случае выводит ошибку
Script file:///сonstants.js unavailable
file:///сonstants.js: File not found


Название: [РЕШЕНО] Внедрить константы внутрь QML документа из вне
Отправлено: Yegor от Ноябрь 13, 2014, 20:57
Правильно делать префикс file:, а не file:/

Чтобы выглядело:
Код:
import "file:constants.js"

Тогда js загрузится, из той директории, где и исполняемый.

Задача решена. Спасибо всем!