我正在做一个基于任务的程序,需要插件。任务需要具有易于编辑的属性,我认为这可以通过Qt的元对象编译器反射功能来完成(我可能是错误的,但是我应该可以将它粘贴到QtPropertyBrowser中?)试图制作一个插件系统在C++/Qt
因此,这里是基:
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模块中。据我所知,每个插件只能加载一个接口(我可能是错的?)。如果是这样,完成我所需要的唯一可能的方法是创建一个带有基于字符串的键的FactoryInterface,它返回对象(如Qt的即插即用示例),这是我想避免的一个可怕的样板。
任何人都知道比Qt做得更干净的C++插件架构来做我想做的事情吗?另外,我是否安全地假设Qt的反射能力会做我想做的事情(即能够在调度之前用QtPropertyBrowser编辑未知动态加载任务的属性)????????????????????????????????
伟大的阅读和一个示例框架解决方案启动。基本上它说你只需要一个更智能的工厂系统来避免字符串键给你的样板,我想我是在过度思考问题。如果我能整合它,这可能会解决我的困境。谢谢。 – 2010-04-26 02:18:53