我是一个基于任务的程序,需要有插件。任务需要具有可轻松编辑的属性,我认为可以使用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插件设置唯一的问题是我想在一个.dll模块中存储X数量的任务。据我所知,您只能每次加载一个接口(我可能错了?)。如果是这样,实现我想要的唯一可能的方法是创建一个基于字符串的键的FactoryInterface,返回对象(就像Qt的Plug-And-Paint示例中那样),这是一个可怕的样板,我想避免。
有人知道比Qt更清洁的C++插件架构来实现我的需求吗?
另外,我可以安全地假设Qt的反射功能将实现我想要的功能(即在分派之前使用QtPropertyBrowser编辑未知动态加载任务的属性)吗?