试图用C++/Qt制作一个插件系统

Pir*_*fit 6 c++ plugins qt

我正在制作一个需要插件的基于任务的程序.任务需要具有易于编辑的属性,我认为这可以通过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);
}
Run Code Online (Sandbox Code Playgroud)

然后插件可能有这个任务:

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
}
Run Code Online (Sandbox Code Playgroud)

简而言之,这就是我想要做的事情:

// 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
Run Code Online (Sandbox Code Playgroud)

一个.dll有多个任务是很重要的,因为我希望它们通过模块关联.例如,"FileTasks.dll"可能具有删除文件,制作文件等任务.

Qt插件设置的唯一问题是我想在一个.dll模块中存储X量的任务.据我所知,每个插件只能加载一个接口(我可能错了吗?).如果是这样,唯一可行的方法来完成我想要的是创建一个FactoryInterface,其中包含基于字符串的键,它返回对象(如Qt的Plug-And-Paint示例中所示),这是一个我想避免的可怕的样板.

有人知道比Qt更清晰的C++插件架构来做我想要的吗?

另外,我是否安全地假设Qt的反射功能会做我想要的(即能够在调度之前使用QtPropertyBrowser编辑未知的动态加载任务的属性)?

Joh*_*ell 7

听起来你已经给了这个彻底的想法,这是伟大的,需要的.我不能评论Qt细节,但一定不要错过这些插件建议,特别是版本控制:插件架构

编辑:上面的原始链接是borked(8年前添加...).Wayback Machine虽然有副本


Ada*_*m W 5

您是否避免使用Qt的内置插件框架

这里的例子.

编辑:对不起我错过了

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

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