Интерфейсы Qt или абстрактные классы и qobject_cast () - PullRequest
21 голосов
/ 16 сентября 2010

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

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

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

1 Ответ

29 голосов
/ 16 сентября 2010

После некоторых исследований и чтения документации 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
}
...