Попытка сделать систему плагинов в C ++ / Qt - PullRequest
6 голосов
/ 26 апреля 2010

Я делаю основанную на задачах программу, которая должна иметь плагины. Задачи должны иметь свойства, которые можно легко редактировать, я думаю, что это можно сделать с помощью возможностей отражения мета-объектного компилятора Qt (я могу ошибаться, но я должен быть в состоянии вставить это в QtPropertyBrowser?)

Итак, вот база:

class Task : public QObject
{
Q_OBJECT
public:
    explicit Task(QObject *parent = 0) : QObject(parent){}

    virtual void run() = 0;

signals:
    void taskFinished(bool success = true);
}

Тогда плагин может иметь эту задачу:

class PrinterTask : public Task
{
Q_OBJECT
public:
    explicit PrinterTask(QObject *parent = 0) : Task(parent) {}

    void run()
    {
        Printer::getInstance()->Print(this->getData());  // fictional
        emit taskFinished(true); 
    }

    inline const QString &getData() const;
    inline void setData(QString data);

Q_PROPERTY(QString data READ getData WRITE setData) // for reflection
}

В двух словах, вот что я хочу сделать:

// load plugin
// find all the Tasks interface implementations in it
// have user able to choose a Task and edit its specific Q_PROPERTY's
// run the TASK

Важно, чтобы у одного .dll было несколько задач, потому что я хочу, чтобы они были связаны их модулем. Например, «FileTasks.dll» может иметь задачи для удаления файлов, создания файлов и т. Д.

Единственная проблема с настройкой плагина Qt - я хочу сохранить количество задач X в одном модуле .dll. Насколько я могу судить, вы можете загрузить только один интерфейс для каждого плагина (я могу ошибаться?). Если это так, то единственный возможный способ выполнить то, что я хочу, - это создать FactoryInterface со строковыми ключами, которые возвращают объекты (как в примере Qt Plug-and-Paint), что является ужасным образцом, которого я хотел бы избежать.

Кто-нибудь знает более чистую архитектуру плагинов C ++, чем Qt, чтобы делать то, что я хочу?

Кроме того, могу ли я предположить, что возможности отражения Qt будут делать то, что я хочу (т.е. редактировать свойства неизвестных динамически загружаемых задач с помощью QtPropertyBrowser перед отправкой)?

Ответы [ 2 ]

7 голосов
/ 26 апреля 2010

Звучит так, будто вы тщательно обдумывали это, и это здорово и нужно. Я не могу комментировать специфику Qt, но не пропустите эти советы по плагину, особенно versioning : Архитектура плагина

РЕДАКТИРОВАТЬ: Исходная ссылка выше является borked (был добавлен 8 лет назад ...). У Wayback Machine есть копия, хотя

5 голосов
/ 26 апреля 2010

Любая причина, по которой вы избегаете встроенной в Qt инфраструктуры плагинов ?

Пример здесь .

Редактировать: Извините, что пропустил

Насколько я могу судить, вы можете загрузить только один интерфейс для каждого плагина

раньше. Пример plug-and-paint показывает, что вы можете реализовать множество интерфейсов в одном плагине. И я запутался из-за фабрики на основе строк, о которой вы говорите, в примере используются объекты QObject, слоты и сигналы после загрузки плагинов. Строки используются только для отображения названия плагина в меню справки.

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