Я понимаю, как выставлять простые члены данных, создавая новый класс QObject
, который имеет мой класс в качестве члена. Например:Как открыть класс QQbject с элементами указателя в QML?
class MyClass {
public:
int anInt;
};
И обертка
class MyClassQWrapped : public QObject {
Q_OBJECT
Q_PROPERTY(int anInt READ anInt write setAnInt NOTIFY anIntChanged)
public:
int anInt(){return myClass.anInt;}
void setAnInt(int value){
if(myClass.anInt==value)return;
myClass.anInt = value;
emit anIntChanged;
}
signals:
anIntChanged();
private:
MyClass myClass;
};
Но как я обертываю объекты с членами данных указателя? Скажем, например, я был связан класс списка, и хотел, чтобы выставить его на QML:
Class LinkedList {
public:
int anInt;
LinkedList *next;
};
Я не могу использовать тот же подход, что и выше, потому что тогда свойство оболочки будет указатель на LinkedList
, не LinkedListQWrapped
. Если список изменен кодом, отличным от Qt, у меня нет способа узнать, какой (если есть) объект LinkedListQWrapped
соответствует заданному LinkedList*
.
Теперь мне разрешено изменять модель C++, но я не могу позволить этому зависеть от Qt. Я могу придумать одно решение, в котором я добавляю пользовательский элемент данных к классу C++, а затем задаю его, чтобы он указывал на соответствующий обернутый объект, как только я создал оболочку.
Я видел такого рода вещи, сделанные в box2d.
Это рекомендуемый способ решить эту проблему? Общепринято ли предоставлять пользователям void*
пользовательские данные в библиотечном коде, чтобы заставить их играть хорошо с различными инфраструктурами, такими как Qt? Или есть другое решение этой проблемы?
А, отлично! Не знаю, было ли расширение QML для box2d. Вероятно, я тоже это сделаю. Это будет полезно использовать в качестве ссылки. – bobbaluba