我正在制作一个需要插件的基于任务的程序。任务需要具有可以轻松编辑的属性,我认为这可以通过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编辑未知的动态加载任务属性)?
答案 0 :(得分:7)
听起来你已经给了这个彻底的想法,这是伟大的,需要的。我无法评论Qt的具体细节,但请务必不要错过这些插件建议,特别是版本化:Plugin Architecture
编辑:上面的原始链接是borked(8年前添加了...)。 The Wayback Machine has a copy though
答案 1 :(得分:5)
您是否有任何理由避免使用Qt的内置plugin framework?
示例here。
编辑:对不起,我错过了
据我所知,每个插件只能加载一个接口
之前。 plug-and-paint示例显示您可以在一个插件中实现许多接口。我对你正在讨论的基于字符串的工厂感到困惑,该示例在加载插件后使用QObjects,插槽和信号。字符串仅用于在帮助菜单中显示插件的名称。