2010-04-25 66 views
5

我正在做一个基于任务的程序,需要插件。任务需要具有易于编辑的属性,我认为这可以通过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编辑未知动态加载任务的属性)????????????????????????????????

回答

6

听起来像你一直在给这个彻底的想法,这是伟大的和需要的。我不能对Qt的细节发表评论,但一定不要错过这些作品插件的建议,特别是版本Plugin Architecture

+0

伟大的阅读和一个示例框架解决方案启动。基本上它说你只需要一个更智能的工厂系统来避免字符串键给你的样板,我想我是在过度思考问题。如果我能整合它,这可能会解决我的困境。谢谢。 – 2010-04-26 02:18:53

4

你避免任何原因,Qt的内置plugin framework

示例here

编辑:对不起,我错过了

据我所知,你只能加载插件每一个接口

之前。 plug-and-paint示例显示您可以在一个插件中实现多个接口。我对你正在讨论的基于字符串的工厂感到困惑,这个例子在加载插件后使用QObject,插槽和信号。字符串仅用于在帮助菜单中显示插件的名称。

+0

我的意思是一种轻松加载许多继承一个插件接口的类的方法。也许我很困惑,但它看起来像只能加载每种接口类型之一?必须使用我认为的解决方法。 – 2010-04-26 20:09:35

+0

也许我很困惑,你想从一个DLL加载多个插件?首先,为什么不是少文件?其次,我相信如果是这样的话,那么是的,你是对的。每个DLL只有一个插件,但每个插件可以实现多个接口。如果你想要一个单一的DLL的唯一原因是为了少文件,我会强烈建议不然。更小的编译单元可加快重新编译时间并更轻松地进行测试。 – 2010-04-26 20:40:46

+0

每个插件一个DLL使开发人员和用户更简单。完全同意亚当。 – 2017-10-03 11:59:29