Ответ 1
После некоторых исследований и чтения документации qobject_cast я нашел это:
qobject_cast() также может использоваться в соединение с интерфейсами; см. Пример Plug and Paint для деталей.
Вот ссылка на пример: Plug and 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
}