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