Имитация сбоя qobject_cast - PullRequest
       5

Имитация сбоя qobject_cast

0 голосов
/ 27 февраля 2012

У меня есть чистый виртуальный класс A, на котором я делаю

Q_DECLARE_INTERFACE(A, "org.something.A")

и у меня есть плагин, реализованный как класс B, который наследует A и QObject, имеет интерфейс A и реализует все чисто виртуальные методы A

class B : public QObject, public A
{
    Q_OBJECT
    Q_INTERFACES(A)

    public:
        void someMethod();
}

и в cpp:

Q_EXPORT_PLUGIN2(A, A)

Это хорошо работает. В действительности существует много различных интерфейсов, и основное приложение (которое я не написал и на котором я не могу делать большие модификации) вызывает

qobject_cast<A *>(bPointer);

и проверяет результат, чтобы узнать, реализует ли определенный плагин интерфейс.

Все это работает очень хорошо.

Как бы то ни было, я бы хотел, чтобы в классе B во время выполнения определялся, хочу ли я реализовать определенный интерфейс.

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

Это может звучать странно, но причина этого в том, что я хотел бы добавить плагины Python (или других языков). У них будет оболочка C ++. Их исходный код на python будет храниться с использованием файла rcc. Код C ++ должен быть одинаковым для всех плагинов Python.

Оболочка c ++ будет вызывать метод python, чтобы определить, какие интерфейсы реализованы кодом python, и вызвать сбой qobject_cast, если код python не реализуется для интерфейса. Класс-оболочка C ++ будет реализовывать все интерфейсные методы и перенаправлять вызов в python, но на самом деле будут вызываться только те, которые были успешно преобразованы.

Это может быть осуществимо путем переопределения мета-связанных методов QObject, но я не знаю, какие именно.

Надеюсь, вы понимаете, что я пытаюсь сделать (хотя это не очень понятно). Может быть, есть совершенно другой способ сделать это?

Спасибо

1 Ответ

0 голосов
/ 27 февраля 2012

Вы не можете изменить поведение qobject_cast, , используя только открытые API Qt.Также обратите внимание, что вы можете иметь только один экземпляр объекта плагина для каждой библиотеки плагинов.

Решением будет плагин, работающий как фабрика и возвращающий интерфейсы по запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...