Я делаю программу на основе задач, которая должна иметь плагины. Задачи должны иметь свойства, которые могут быть легко отредактированы, я думаю, что это может быть сделано с возможностями отражения Компилятора Метаобъекта 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 прежде, чем диспетчеризировать)?
Похоже, вы тщательно обдумали это, и это здорово и необходимо. Я не могу комментировать особенности Qt, но обязательно не пропустите эти советы по плагинам, в частности управление версиями : Архитектура плагина
РЕДАКТИРОВАТЬ: Исходная ссылка выше заблокирована (добавлено 8 лет назад ...). У Wayback Machine есть копия, хотя
По какой причине вы избегаете встроенной в Qt инфраструктуры плагинов ?
Пример здесь .
Редактировать: Извините, я пропустил
Насколько я могу судить, раньше вы могли загружать только один интерфейс для каждого плагина
. Пример plug-and-paint показывает, что вы можете реализовать множество интерфейсов в одном подключаемом модуле. И меня смущает фабрика на основе строк, о которой вы говорите, в примере используются объекты QObjects, слоты и сигналы после загрузки плагинов. Строки просто используются для отображения имени плагина в меню справки.