【问题标题】:Trying to make a plugin system in C++/Qt尝试在 C++/Qt 中制作插件系统
【发布时间】:2010-04-25 22:27:41
【问题描述】:

我正在制作一个需要插件的基于任务的程序。任务需要具有易于编辑的属性,我认为这可以通过 Qt 的 Meta-Object Compiler 反射功能来完成(我可能是错的,但我应该能够将其粘贴在 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 插件设置的唯一问题是我想将 X 数量的任务存储在一个 .dll 模块中。据我所知,每个插件只能加载一个接口(我可能错了吗?)。如果是这样,完成我想要的唯一可能的方法是使用返回对象的基于字符串的键创建 FactoryInterface(如 Qt 的 Plug-And-Paint 示例中),这是我想避免的可怕样板。

有人知道比 Qt 更简洁的 C++ 插件架构来做我想做的事吗?

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

【问题讨论】:

    标签: c++ qt plugins


    【解决方案1】:

    听起来您已经对此进行了彻底的思考,这很好,也很需要。我无法评论 Qt 的细节,但一定不要错过这些插件建议,尤其是版本控制Plugin Architecture

    编辑: 上面的原始链接是 borked(8 年前添加的......)。 The Wayback Machine has a copy though

    【讨论】:

    • 伟大的阅读和启动的示例框架解决方案。基本上它说你只需要一个更智能的工厂系统来避免字符串键给你的样板,我想我是在想这个问题。如果我可以整合它,这可能会解决我的问题。谢谢。
    • 链接已损坏。有人知道这个的更新链接吗?
    • @Kobe:我添加了那篇文章的 Wayback Machine 副本。感谢您让我们知道它很无聊。
    【解决方案2】:

    您有什么理由避免使用 Qt 的内置 plugin framework

    例如here

    编辑:对不起,我错过了

    据我所知,每个插件只能加载一个界面

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

    【讨论】:

    • 我的意思是一种轻松加载许多继承插件中一个接口的类的方法。也许我很困惑,但看起来你只能加载每种接口类型中的一种?我认为必须使用一种解决方法。
    • 也许我也很困惑,你想从一个 dll 加载多个插件?首先,为什么除了更少的文件?其次,我相信如果是这样的话,那么是的,你是对的。每个dll只是一个插件,但每个插件可以实现多个接口。如果您想要一个 dll 的唯一原因是为了减少文件,我强烈建议您不要这样做。更小的编译单元会导致更快的重新编译时间和更容易的测试。
    • 每个插件一个 DLL 使开发人员和用户的事情变得更加简单。完全同意亚当。
    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多