Я использую QJSEngine
, чтобы сделать приложение доступным для сценариев. Я бы хотел, чтобы сторона JavaScript могла изменять пользовательский интерфейс. Моя главная проблема сейчас — доступ к Qt API из 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()
, но они re not: QMetaType::type("QStandardItemModel")
терпит неудачу, возвращая UnknownType
. Опять же, я пропустил какой-то вызов функции инициализации, который регистрирует все?
QStandardItemModel
илиQStandardItem
не помечена какQ_INVOKABLE
, поэтому я даже не могу их вызвать. Возможно, я просто переоценил возможности сценариев Qt. - person isanae   schedule 01.10.2016QQmlEngine
и по-прежнему использовать виджеты, поскольку QML не зависит от пользовательского интерфейса и работает с любыми классами, производными от QObject. Можно даже создавать деревья виджетов в QML, хотя в настоящее время существует регрессия (работавшая в Qt4), которая заставляет отладочную сборку Qt утверждать при помещении виджета в родительский элемент, не являющийся виджетом, в QML. - person Kevin Krammer   schedule 02.10.2016