Hi Ulf.

MOC is fine, it's the Q_GADGET macro:
#define Q_GADGET_EXPORT(...) \
public: \
    static __VA_ARGS__ const QMetaObject staticMetaObject; \
    void qt_check_for_QGADGET_macro(); \
    typedef void QtGadgetHelper; \
private: \
    QT_WARNING_PUSH \
    Q_OBJECT_NO_ATTRIBUTES_WARNING \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, 
QMetaObject::Call, int, void **); \
    QT_WARNING_POP \
    QT_ANNOTATE_CLASS(qt_qgadget, "") \
    /*end*/

/* qmake ignore Q_GADGET */
#define Q_GADGET Q_GADGET_EXPORT()

On 10/28/23 00:05, Stefan Seefeld wrote:
Hi Uli,

thank you for sharing that document, that's indeed very helpful.
Following its examples, I was able to set up my singleton such that both 
runtimes (C++, QML) would share the same instance.
Doing that I bumped into what I would consider a bug, probably in the MOC 
infrastructure:
The example I used was

```
struct SingletonForeign
{
   Q_GADGET
   QML_FOREIGN(MySingleton)
   QML_SINGLETON
   QML_NAMED_ELEMENT(MySingleton)
public:
   static MySingleton *create(QQmlEngine *, QJSEngine *engine);
};

```

which works fine. Then I wanted to clean the code up a little more, and removed the 
"public:", given that the above is a `struct`, so everything in it is public 
anyhow. And that's where it stopped working !
I assume this is because the MOC isn't really aware of C++ semantics, and for some reason 
really requires the "public" specifier to be there. Why isn't the MOC using an 
actual compiler frontend to analyse these declarations ?

Thanks,

--

       ...ich hab' noch einen Koffer in Berlin...


_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest
_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to