Подтвердить что ты не робот

Qt-интерфейсы или абстрактные классы и qobject_cast()

У меня довольно сложный набор классов С++, которые переписываются с Java. Таким образом, каждый класс имеет один унаследованный класс, а затем он реализует один или несколько абстрактных классов (или интерфейсов).

Можно ли использовать qobject_cast() для преобразования из класса в один из интерфейсов? Если я получаю все интерфейсы от QObject, я получаю ошибку из-за неоднозначных ссылок QObject. Если, однако, у меня есть только базовый класс, унаследованный от QObject, я не могу использовать qobject_cast(), потому что он работает с QObject s.

Я бы хотел, чтобы вы могли обойти классы между плагинами и DLL, на которые ссылаются их интерфейсы.

4b9b3361

Ответ 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
}