@@ -82,24 +82,14 @@ public: \
8282 propertyChanged (#name); \
8383 }
8484
85- #define NUT_FOREIGN_KEY (type, keytype, name, read, write ) \
86- Q_PROPERTY (Nut::Row<type> name READ read WRITE write) \
87- NUT_DECLARE_FIELD(keytype, name##Id, read##Id, write##Id) \
88- NUT_INFO(__nut_FOREIGN_KEY, name, type) \
89- Nut::Row<type> m_##name; \
90- public slots: \
91- Nut::Row<type> read () const { return m_##name ; } \
92- Q_INVOKABLE void write (Nut::Row<type> name){ \
93- m_##name = name; \
94- }
95-
9685#define NUT_FOREIGN_KEY_DECLARE (type, keytype, name, read, write ) \
9786 NUT_INFO (__nut_FIELD, name##Id, 0 ) \
9887 NUT_INFO(__nut_FOREIGN_KEY, name, type) \
9988 Nut::Row<type> m_##name; \
10089 keytype m_##name##Id; \
10190 Q_PROPERTY (Nut::Row<type> name READ read WRITE write) \
10291 Q_PROPERTY(keytype name##Id READ read##Id WRITE write##Id) \
92+ Q_PROPERTY(Nut::Row<Table> _##name READ _##read WRITE _##write) \
10393public: \
10494 Nut::Row<type> read() const ; \
10595 keytype read##Id() const ; \
@@ -109,9 +99,11 @@ public: \
10999 (staticMetaObject.className (), #name); \
110100 return f; \
111101 } \
112- public slots: \
113102 void write (Nut::Row<type> name); \
114- void write##Id(keytype name##Id);
103+ void write##Id(keytype name##Id); \
104+ private: \
105+ Nut::Row<Table> _##read() const ; \
106+ void _##write(Nut::Row<Table> name);
115107
116108#define NUT_FOREIGN_KEY_IMPLEMENT (class, type, keytype, name, read, write ) \
117109 \
@@ -132,6 +124,13 @@ public slots: \
132124 m_##name##Id = name##Id; \
133125 m_##name = nullptr ; \
134126 propertyChanged (QT_STRINGIFY2 (name##Id)); \
127+ } \
128+ Nut::Row<Table> class ::_##read() const { return m_##name ; } \
129+ \
130+ void class ::_##write(Nut::Row<Table> name) { \
131+ propertyChanged (QT_STRINGIFY2 (keyname)); \
132+ m_##name = qSharedPointerCast< type >( name );\
133+ m_##name##Id = m_##name->primaryValue ().value <keytype>(); \
135134 }
136135
137136
0 commit comments