【问题标题】:Extending Qt plugin扩展 Qt 插件
【发布时间】:2020-05-28 10:09:00
【问题描述】:

我有一个关于 Qt5 中带有 QML UI 的 c++ 插件的问题。

假设我们有应用程序 A 和应用程序 B。两者都使用用 c++ 编写的插件 C 在 qml 中绘制一些 QQuickItems。

两个应用程序都运行良好。现在我必须使用更多选项来扩展插件(无需绘制,但基于插件 C 中已有的数据)——这就是问题所在——应该只在应用程序 B 中可用。

为什么?需要一些其他库的额外选项不应该添加到应用程序 A。因此应用程序 A 应该使用基本插件运行,应用程序应该使用扩展插件运行。

我的问题是实现这一目标的最佳/常用方法是什么?

我只是想了一下,得到了一些(在我看来不是很好)的解决方案/想法:

  1. 编写一个插件 D 可以做扩展选项。所以应用程序A可以用插件C运行,应用程序用插件C和D运行。缺点是2个插件需要通过qml进行大量通信(插件D需要C的数据)。我觉得这不是很好,有没有更好的方法在两个插件之间进行数据传输?

  2. 编写 2 个插件,其中插件 C 是基本插件,插件 D 具有插件 C 的内容以及扩展选项。那么这当然应该工作,但我将不得不维护代码两次。这绝对不好。

  3. 我考虑了一些条件包含,如果设置了相应的标志,则只包含扩展选项。我对此没有任何经验。但这可能吗?

【问题讨论】:

  • SOLID原理,不用重复造轮子,用时间证明的就好。

标签: c++ qt plugins qml


【解决方案1】:

我认为对您来说最好的方法是您的第三个选项。您可以在插件中添加一个 init 函数。

class PluginC : public plugininterface {

    Q_OBJECT

    Q_PLUGIN_METADATA(IID "plugininterface")
    Q_INTERFACES(plugininterface)

public:
    /* Init the plugin */
    void init( bool extended );

    ...
    ...
    ...

private:
    bool m_extended;
};

插件的其余部分可以像往常一样构建,具有您想要的所有功能。在您的应用程序 A 中,您可以使用extended = false 来初始化您的插件,而在应用程序B 中,您可以使用extended = true 来初始化您的插件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多