Попытка сделать сменную систему в C++ / QT

Я делаю программу на основе задач, которая должна иметь плагины. Задачи должны иметь свойства, которые могут быть легко отредактированы, я думаю, что это может быть сделано с возможностями отражения Компилятора Метаобъекта 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), который является ужасным шаблоном, которого я хотел бы избежать.

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

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

6
задан Pirate for Profit 25 April 2010 в 22:54
поделиться

2 ответа

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

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

7
ответ дан 9 December 2019 в 20:41
поделиться

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

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

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

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

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

5
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: