Я создаю проект, используя Q_OBJECT и Q_PROPERTY для доступа к некоторым объектам из скриптов. У меня две проблемы:
Класс B получает форвардное объявление в A, потому что A нуждается в полном типе B в заголовке из-за шаблонов. B нужен только неполный тип (A *) в заголовке, поэтому предварительное объявление является действительным.
Мы не можем вернуть копию, так как нам нужен доступ к фактическому объекту в скрипте. Мы не можем вернуть ссылку, так как Qt не позволяет слотам возвращать ссылки - их тип будет проигнорирован, они будут возвращать только void *.
Полная загрузка кода на pastebin или как ZIP-архив или как ZIP-архив из минимальный пример доступен для тестирования / воспроизведения: мне нужно было разделить файлы для форвардного объявления и для MOC. Я добавил Makefile, чтобы проверить это. Сделайте deps: g ++, moc, Qt.
class A; // forward declaration necessary, see explanation above
class B : public QObject {
Q_OBJECT
Q_PROPERTY(A a READ GetA) // <-- ERROR HERE
// ...
public slots:
A* GetA() {
return mA;
}
private:
A* mA;
// ...
}
Строка ошибки в скрипте:
print(bObj.GetA().GetName());
Эта ошибка исчезает, когда я закомментировал Q_PROPERTY выше.
tmp/B.moc.hpp:95:51: error: invalid use of incomplete type ‘struct A’
tmp/../B.hpp:10:7: error: forward declaration of ‘struct A’
] Если опустить Q_PROPERTY и вызвать метод GetA () в качестве слота из сценария, я получаю следующее исключение:
Line 7: "TypeError: cannot call GetA(): unknown return type `A*'
(register the type with qScriptRegisterMetaType())"
При регистрации A * с помощью qRegisterMetaType ("A *");
это изменяется на:
Line 7: "TypeError: Result of expression 'bObj.GetA().GetName'
[undefined] is not a function."
Это показывает, что GetA () не возвращает объект A или каким-то образом возвращает указатель, но сценарий не может разыменовать его. GetA () тогда фактически возвращает QVariant (A *)
, можно ли это как-то использовать?
.
, если что-то подобное существует) или