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

У меня есть набор классов C++, доступных для 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?

1 ответ

Решение

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

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

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

Другие вопросы по тегам