Я использую QJSEngine
сделать приложение сценарием. Я бы хотел, чтобы сторона JavaScript могла изменять пользовательский интерфейс. Моя главная проблема сейчас — доступ к API Qt из JavaScript.
Для создания виджетов я добавил createWidget()
обертка, которая использует QUILoader
:
// JavaScript
var w = helpers.createWidget("QPushButton");
// C++
QJSValue helpers::createWidget(QString type)
{
QUILoader ld;
return engine.newQObject(ld.createWidget(type));
}
Я также зарегистрировал все перечисления из qt_getQtMetaObject()
который, кажется, заботится обо всех перечислениях уровня пространства имен от qnamespace.h
, Похоже, это не часть публичного API.
Я действительно должен это делать вручную или мне чего-то не хватает? Разве нет registerAllTheThings()
функция, которая создает глобальный Qt
объект, через который доступен Qt API?
Если нет, то у меня проблема. Я могу создать QWidget
с QUILoader
, но я не смог найти способ создания других объектов, таких как QStandardItemModel
. Я думал, что все классы Qt уже будут зарегистрированы через qRegisterMetaType()
, но они не QMetaType::type("QStandardItemModel")
не возвращается UnknownType
, Снова, я пропускаю некоторый вызов функции инициализации, который регистрирует все?
Я бы порекомендовал использовать QQmlEngine
вместо QJSEngine
,
Is является производным от QJSEngine, поэтому он может делать те же вещи, в том же модуле, поэтому никаких дополнительных зависимостей.
Он предоставляет простой способ регистрации типов для создания экземпляров в QML, имеет механизм загрузки плагинов (импорт) и т. Д.
Я представил это как часть моего выступления на Qt World Summit 2015: https://www.youtube.com/watch?v=7LsKoVrb8C8
Других решений пока нет …