Я понимаю, как предоставлять простые элементы данных, создавая новый класс QObject
, членом которого является мой класс. Например:
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. Я могу придумать одно решение, в котором я добавляю элемент пользовательских данных void*
в класс c++, а затем устанавливаю его так, чтобы он указывал на соответствующий обернутый объект после создания оболочки.
Я видел подобное в box2d.
Это рекомендуемый способ решения проблемы? Распространено ли предоставлять void*
пользовательских элементов данных в коде библиотеки, чтобы они хорошо работали с различными фреймворками, такими как Qt? Или есть другое решение этой проблемы?