Пользовательский тип C++ для QJSEngine: возвращаемое значение функции-члена всегда QVariant

У меня есть набор классов С++, открытых для javascript в Qt 5, на основе QJSEngine (поскольку сценарий Qt кажется устаревшим).

Мои производные от QObject классы A и B имеют макрос Q_OBJECT и также используют макрос Q_DECLARE_METATYPE.

Я открыл фабричные функции для своих классов, которые позволяют мне создавать новые экземпляры внутри javascript. Все нижеперечисленное работает нормально:

a = namespace.createNewA(); // QJSEngine reports a type A object
b = namespace.createNewB(); // QJSEngine reports a type B object
b.SetParent(a); // SetParent is a slot of B taking a const A& parameter, gets called correctly
// But now.
b.GetParent(); // Reports QVariant(A), even though this is a slot: A GetParent() const

Есть ли способ убедиться, что GetParent в javascript распознается как фактический объект типа A, а не как QVariant?


person Joris Timmermans    schedule 25.02.2013    source источник


Ответы (1)


Я понял проблемы с моим исходным кодом:

  1. Использование слотов Qt с возвращаемыми значениями, вероятно, не является хорошей идеей в общем случае (см., например, Qt : значение возвращаемого слотом значения?). Я изменил функцию на Q_INVOKABLE, что на самом деле не изменило результат, но казалось более безопасным местом для продолжения.
  2. Возврат по значению также не кажется хорошей идеей для сценариев/оберток. Копаясь в коде с помощью отладчика, я обнаружил, что приведение QVariant к qobject не удалось, и это заставило загореться лампочку: по значению, вероятно, ломается qobject_cast, который пытается найти производный от QObject тип. Я изменил вызов, чтобы он возвращал указатель на QObject, и теперь QJSEngine сообщает об объекте как о правильном типе.

Это потребовало некоторых изменений в моей настройке кода, потому что возвращаемое значение раньше было временным, но я могу с этим смириться.

person Joris Timmermans    schedule 26.02.2013
comment
Не могли бы вы поделиться тем, как вы создавали новые объекты с помощью QJSEngine? Я борюсь с этим сейчас. Все документы, которые я нашел, описывают это на старом движке. - person Jay; 23.02.2015