I have a fairly complex set of C++ classes that are re-written from Java. So each class has a single inherited class, and then it also implements one or more abstract classes (or interfaces).
Is it possible to use qobject_cast()
to convert from a class to one of the interfaces? If I derive all interfaces from QObject
, I get an error due to ambiguous QObject
references. If however, I only have the base class inherited from QObject
, I can't use qobject_cast()
because that operates with QObject
s.
I'd like to be able to throw around classes between plugins and DLLs referred to by their interfaces.
After some research and reading the qobject_cast documentation, I found this:
qobject_cast() can also be used in conjunction with interfaces; see the Plug & Paint example for details.
Here is the link to the example: Plug & Paint.
After digging up the interfaces header in the example, I found the Q_DECLARE_INTERFACE macro that should let you do what you want.
First, do not inherit QObject
from your interfaces. For every interface you have, use the Q_DECLARE_INTERFACE declaration like this:
class YourInterface
{
public:
virtual void someAbstractMethod() = 0;
};
Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")
Then in your class definition, use the Q_INTERFACES macro, like this:
class YourClass: public QObject, public YourInterface, public OtherInterface
{
Q_OBJECT
Q_INTERFACES(YourInterface OtherInterface)
public:
YourClass();
//...
};
After all this trouble, the following code works:
YourClass *c = new YourClass();
YourInterface *i = qobject_cast<YourInterface*>(c);
if (i != NULL)
{
// Yes, c inherits YourInterface
}