После некоторых исследований и чтения документации qobject_cast я обнаружил, что:
qobject_cast () также может использоваться в сочетании с интерфейсами;подробности см. в примере Plug & Paint.
Вот ссылка на пример: Plug & Paint .
После вскрытия интерфейсов заголовок в этом примере я нашел макрос Q_DECLARE_INTERFACE , который должен позволять вам делать то, что вы хотите.
Во-первых, не не наследуют QObject
отинтерфейсы.Для каждого имеющегося интерфейса используйте объявление Q_DECLARE_INTERFACE, например:
class YourInterface
{
public:
virtual void someAbstractMethod() = 0;
};
Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")
Затем в своем определении класса используйте макрос Q_INTERFACES , например:
class YourClass: public QObject, public YourInterface, public OtherInterface
{
Q_OBJECT
Q_INTERFACES(YourInterface OtherInterface)
public:
YourClass();
//...
};
После всех этих проблем работает следующий код:
YourClass *c = new YourClass();
YourInterface *i = qobject_cast<YourInterface*>(c);
if (i != NULL)
{
// Yes, c inherits YourInterface
}