Russian Qt Forum
Ноябрь 01, 2024, 08:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Внедрить константы внутрь QML документа из вне  (Прочитано 6578 раз)
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?
« Последнее редактирование: Ноябрь 13, 2014, 20:58 от Yegor » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Ноябрь 12, 2014, 10:03 »

Может есть смысл использовать QSettings? Сделать обертку в C++, добавить нужное свойство, пробросить в QML, а потом менять значение в конфигурационном ini файле.

P.S. в Qt Quick 2.x можно было бы использовать QML Settings.
« Последнее редактирование: Ноябрь 12, 2014, 10:05 от kibsoft » Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vregess
Гость
« Ответ #2 : Ноябрь 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
    ...........
}
Записан
Отражение луны
Гость
« Ответ #3 : Ноябрь 12, 2014, 15:29 »

Отредактировал пост потому, что не сразу понял задачу. Если Вам нужны настройки - храните их в json в внешнем файле, данные из них подтягивайте при помощи XMLHttpRequest. Распарсить json и подставить данные будет не сложно.
В чем преимущество перед хранением в виде .qml  или .js? Прежде всего в том, что настройки можно будет загружать заново в ходе работы программы.
« Последнее редактирование: Ноябрь 12, 2014, 15:40 от Отражение луны » Записан
Yegor
Гость
« Ответ #4 : Ноябрь 13, 2014, 19:50 »

Самый простой способ - хранить константы в отдельном реальном .js
Я кладу его рядом с исполняемым.

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

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

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

Попробуй добавить QCoreApplication::applicationDirPath() в QDeclarativeEngine::addImportPath().
Записан
Yegor
Гость
« Ответ #6 : Ноябрь 13, 2014, 20:46 »

Цитировать
Попробуй добавить QCoreApplication::applicationDirPath() в QDeclarativeEngine::addImportPath().
Попробовал. Все равно не помогает. Да и лишнее оно, такой путь и так по умолчанию есть (смотрел QDeclarativeEngine::importPathList()).

В доке нашел, что если нужно грузить файлы из файловой системы, то нужно указывать префикс file:/
Но в таком случае выводит ошибку
Script file:///сonstants.js unavailable
file:///сonstants.js: File not found
« Последнее редактирование: Ноябрь 13, 2014, 20:53 от Yegor » Записан
Yegor
Гость
« Ответ #7 : Ноябрь 13, 2014, 20:57 »

Правильно делать префикс file:, а не file:/

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

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

Задача решена. Спасибо всем!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 23.