py> obj.Geometry.Position.x = 100
py>obj.Geometry.Yaw = 100 # так называется x ;-)py>obj.Geometry.Pitch = 0 # ypy>obj.Geometry.Roll = 0 # z
py> obj.Position.x = 100
py> obj.Position.x = 100py> test = obj.Geometry.Yaw
// прикладные классыclass Position{public: int x; int y; int z;};class Geometry{public: Position position;};class Queer{public: Geometry geometry;};
// врапперы прикладных классовclass PositionWrapper : public QObject { Q_OBJECTpublic slots: // конструктор и деструктор Position* new_Position() { return new Position(); } void delete_Position(Position* o) { delete o; } // эмуляторы свойств int py_get_x(Position* o) { return o->x; } void py_set_x(Position* o, int value) { o->x = value; } int py_get_y(Position* o) { return o->y; } void py_set_y(Position* o, int value) { o->y = value; } int py_get_z(Position* o) { return o->z; } void py_set_z(Position* o, int value) { o->z = value; }};class GeometryWrapper : public QObject { Q_OBJECTpublic slots: // конструктор и деструктор Geometry* new_Geometry() { return new Geometry(); } void delete_Geometry(Geometry* o) { delete o; } // эмуляторы свойств int py_get_yaw(Geometry* o) { return o->position.x; } void py_set_yaw(Geometry* o, int value) { o->position.x = value; } int py_get_pitch(Geometry* o) { return o->position.y; } void py_set_pitch(Geometry* o, int value) { o->position.y = value; } int py_get_roll(Geometry* o) { return o->position.z; } void py_set_roll(Geometry* o, int value) { o->position.z = value; } Position* py_get_position(Geometry* o) { return &o->position; } void py_set_position(Geometry* o, Position value) { o->position = value; }};class QueerWrapper : public QObject { Q_OBJECTpublic slots: // конструктор и деструктор Queer* new_Queer() { return new Queer(); } void delete_Queer(Queer* o) { delete o; } // эмуляторы свойств Geometry* py_get_geometry(Queer* o) { return &o->geometry; } void py_set_geometry(Queer* o, Geometry value) { o->geometry = value; } Position* py_get_position(Queer* o) { return &o->geometry.position; } void py_set_position(Queer* o, Position value) { o->geometry.position = value; }};
// регистрация прикладных классов PythonQt::self()->registerCPPClass("Position", "","QtCore", PythonQtCreateObject<PositionWrapper>); PythonQt::self()->registerCPPClass("Geometry", "","QtCore", PythonQtCreateObject<GeometryWrapper>); PythonQt::self()->registerCPPClass("Queer", "","QtCore", PythonQtCreateObject<QueerWrapper>);
py>obj = Queer()py>obj.geometry.position.x = 100py>print obj.geometry.yaw100py>obj.geometry.pitch = 200py>print obj.geometry.position.y200
class GeometryWrapper : public QObject { Q_OBJECTpublic slots:... void py_set_yaw(Geometry* o, int value) { o->position.x = value; }
class PositionWrapper : public QObject { Q_OBJECTpublic slots: void py_set_x(Position* o, int value) { o->x = value; }
void py_set_x(Position* o, int value) { o->x = value; o->p->DoModifyX(); // p - указатель на данные приложения}
py> test = Position()
py> test = Position() # это просто пытон-переменная, py> obj1.Geometry.Position = test # а здесь я должен реагировать на изменениеpy> obj1.Geometry.Yaw = 10 # а здесь проверить есть ли Yaw для obj1
py> test = Position() py> obj1.Geometry.Position = test
py> obj.Geometry.Position.x = 1 # Ок если obj имеет флаг "implicit" иначе должна быть ошибкаpy> obj.Geometry.yaw = 1 # Ок если obj имеет флаг "explicit" иначе должна быть ошибкаpy> obj.Position.x = 1 # универсальный вариант, сам разбирается с флагом
// шаблон декоратора. Наследует либо QObject, либо враппер базового класса#include <QObject>#include "$ClassType$.h"#include "wrap_ed_objects.h"//---------------------------------------------------------------------------class $ClassType$Wrapper : public $BaseType$Wrapper { Q_OBJECTpublic slots: // конструктор и деструктор $ClassType$* new_$ClassType$() { return new $ClassType$(); } void delete_$ClassType$($ClassType$* o) { delete o; } // эмуляторы свойств QString py_get_$Property$($ClassType$* o) { return o->$Property$; } void py_set_$Property$($ClassType$* o, QString value) { o->$Property$ = value; } $PropertyType$* py_get_$Property$($ClassType$* o) { return &o->$Property$; } void py_set_$Property$($ClassType$* o, $PropertyType$ value) { o->$Property$ = value; }};//---------------------------------------------------------------------------