Qt: Q_PROPERTY с указателем и предварительным объявлением для доступа QtScript

Проблема

Я создаю проект, используя Q_OBJECT и Q_PROPERTY для доступа к некоторым объектам из скриптов. У меня две проблемы:

  1. создание классов, использующих опережающие объявления, с возможностью сценария
  2. , возвращающих свойство как указатель

Пояснения

1. Почему форвардное объявление?

Класс B получает форвардное объявление в A, потому что A нуждается в полном типе B в заголовке из-за шаблонов. B нужен только неполный тип (A *) в заголовке, поэтому предварительное объявление является действительным.

2. Зачем возвращать указатель?

Мы не можем вернуть копию, так как нам нужен доступ к фактическому объекту в скрипте. Мы не можем вернуть ссылку, так как 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 *) , можно ли это как-то использовать?

Вопросы:

  1. Могу ли я каким-то образом создать Q_PROPERTY из неполного типа или как избежать прямого объявления?
  2. Могу ли я вернуть ссылку в слоте (возможно, некоторые уловки, например, класс, который обертывает указатель и «переопределяет» оператор сценария . , если что-то подобное существует) или
  3. Могу ли я как-то разыменовать QVariant (A *) на A в QtScript?
5
задан opatut 5 August 2011 в 16:26
поделиться