Можно ли реализовать плагин приложения Qt, используя базовый и производный класс?

Предположим, у меня есть следующий игрушечный интерфейс:

class iTest{
virtual ~iTest(void) = 0;
virtual void doA(void) = 0;
virtual void doB(void) = 0;
}

Q_DECLARE_INTERFACE(iTest, "somestring")

Я хотел бы реализовать это в двух классах: Base и Derived.

class Base : public QObject, public iTest
{
Q_OBJECT
Q_PLUGIN_METADATA (IID "somestring")
Q_INTERFACES(iTEST)
explicit Base(QObject* parent=0);
void doA(void); // do common thing all derived need do
int data; // some data member all derived should have
}

class Derived: public Base
{
Q_OBJECT
Q_PLUGIN_METADATA (IID "somestring")
Q_INTERFACES(iTEST)
explicit Derived(QObject* parent = 0);
void doB(); // do something custom dervived objects need do
}

Мои ошибочные рассуждения говорят мне, что это должно работать. Абстрактный базовый класс для плагина, дающий функциональность для части интерфейса, в то время как производные классы составляют его оставшуюся часть. Я могу получить это для компиляции с некоторым разумным удалением макросов (макрос метаданных базового класса). Однако полученные плагины не будут загружаться. Поэтому я предполагаю, что в моих рассуждениях есть что-то ошибочное, на что более опытный разработчик Qt или разработчик C ++ может указать, что я просто не вижу.

0

Решение

Я верю, что нашел решение для этого. Как упоминал Александр V, макросы Q_ в базовом и производном классах конфликтуют друг с другом. В документации говорится, что в коде может быть только один вызванный макрос Q_PLUGIN_METADATA. Мне пришло в голову, что сам базовый класс даже не должен быть Q_Object, это просто контейнер для функций. Поэтому я повторно объявил классы следующим образом:

class Base: public iTest{
void doA(void); // do something all derived should do
int data; // data all derived should have
}

class Derived: public QObject, public Base{
Q_OBJECT
Q_PLUGIN_METADATA (IID "somestring")
Q_INTERFACES(iTEST)
void doB(void): // custom to derived
}

Также интерфейс нуждается в небольшой модификации:

...
virtual ~iTest(void){}
...

Это связано с тем, что деструктор должен быть определен и не может быть чисто виртуальным. С этими модификациями, эта структура, кажется, работает в моем приложении.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]