Qt interfaces or abstract classes and qobject_cast()

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 QObjects.

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
    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_INTERFACES(YourInterface OtherInterface)



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

Need Your Help

Is there an elegant way to split a file by chapter using ffmpeg?


In this page, Albert Armea share a code to split videos by chapter using ffmpeg. The code is straight forward, but not quite good-looking.

Properties vs Methods

c# properties methods

Quick question: When do you decide to use properties (in C#) and when do you decide to use methods?