[Interest] C++ abstract class expose to Qml and property
Jérôme Godbout
godboutj at amotus.ca
Fri Feb 12 21:18:05 CET 2021
I made a test with Q_GADGET but ended into the same problem:
class SerializationInterface
{
Q_GADGET
public:
virtual bool serialize(QDataStream& stream) = 0;
virtual bool deserialize(QDataStream& stream) = 0;
};
Q_DECLARE_METATYPE(SerializationInterface*)
class OtherObject : public QObject, public Serializationinterface
{
Q_OBJECT
public:
bool serialize(QDataStream& stream) override;
bool deserialize(QDataStream& stream) override;
};
Q_DECLARE_METATYPE(OtherObject*)
main.cpp
qmlRegisterUncreatableType<SerializationInterface>(...);
But I'm still getting this when assigning from Qml to Q_PROPERTY(SerializationInterface* obj READ obj WRITE set_obj NOTIFY objChanged):
Error: Cannot assign QObject* to SerializationInterface*
hummm, maybe something is missing...
From: Interest <interest-bounces at qt-project.org> On Behalf Of Jérôme Godbout
Sent: February 12, 2021 12:46 PM
To: interest at qt-project.org
Subject: [Interest] C++ abstract class expose to Qml and property
Hi,
I'm having trouble figuring out what is the best way to do the following:
1. I have an C++ abstract class that doesn't inherite QObject with abstract method (class SerializationInterface)
2. I want to expose that class to Qml and be able to have SerializationInterface* Q_PROPERTY into some other class.
3. The class that implement the SerializationInterface already inherit QObject.
class SerializationInterface
{
public:
virtual bool serialize(QDataStream& stream) = 0;
virtual bool deserialize(QDataStream& stream) = 0;
};
class OtherObject : public QObject, public Serializationinterface // Here the QObject is a more complexe QObject inherited class, just to simplify writing for example
{
Q_OBJECT
public:
bool serialize(QDataStream& stream) override;
bool deserialize(QDataStream& stream) override;
};
class ControllerA : public QObject
{
Q_OBJECT
Q_PROPERTY(SerializationInterface* obj READ ....)
};
Is this possible? I have test the following so far:
1. Q_DECLARE_METATYPE(SerializationInterface*) seem to be impossible since it's not a Q_Object
2. Make the a Q_DECLARE_INTERFACE(SerializationInterface, "com.mymodulename") but I cannot use that as Property with only that.
3. Adding QML_INTERFACE to SerializationInterface doesn't seem to allow assigning a QObject* that implement the SerializationInterface to the SerializationInterface* property.
4. I cannot call qmlRegisterInterface<SerializationInterface>(...)
5. I did try to add Q_DECLARE_METATYPE(SerializationInterface*) after the Q_DECLARE_INTERFACE() now it seem to work either
gaving me this so far but it doesn't work, when try to set in Qml "controllerA.obj = otherObjectInstance" I always end up with : "Error: Cannot assign QObject* to SerializationInterface*"
class SerializationInterface
{
QML_INTERFACE
public:
virtual bool serialize(QDataStream& stream) = 0;
virtual bool deserialize(QDataStream& stream) = 0;
};
Q_DECLARE_INTERFACE(SerializationInterface, "com.mymodulename")
Q_DECLARE_METATYPE(SerializationInterface*)
class OtherObject : public QObject, public Serializationinterface // Here the QObject is a more complexe QObject inherited class, just to simplify writing for example
{
Q_OBJECT
Q_INTERFACES(SerializationInterface)
public:
bool serialize(QDataStream& stream) override;
bool deserialize(QDataStream& stream) override;
};
How does accomplish this properly? Is it even possible? How do you solved it?
Thanks, regards,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20210212/5f05085c/attachment.html>
More information about the Interest
mailing list