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