插件之间的 Qt 管道数据

Posted

技术标签:

【中文标题】插件之间的 Qt 管道数据【英文标题】:Qt piping data between plugins 【发布时间】:2016-03-20 17:29:28 【问题描述】:

我正在开发一个基于插件的应用程序,遵循Echo Plugin Example。

到目前为止一切顺利。现在我想在插件之间传输数据。我有一个使用QTcpSocket 建立网络连接的插件,我还有另一个插件,我想在QTextEdit 中显示数据。如何在插件之间传递数据?

如果两个都是简单的对象,我会做简单的信号槽连接,但是由于插件的接口不是从 QObject 派生的,所以不可能有信号槽。或者,至少我不知道怎么做。

【问题讨论】:

【参考方案1】:

实际上,信号槽是可能的。您所要做的就是将您的插件转换为 QObject。示例:

你的插件界面:

class MyPluginInterface1

public:
    virtual ~MyPluginInterface1() 

signals:
    virtual void mySignal() = 0;


class MyPluginInterface2

public:
    virtual ~MyPluginInterface2() 

public slots:
    virtual void mySlot() = 0;


Q_DECLARE_INTERFACE(MyPluginInterface1, ...)
Q_DECLARE_INTERFACE(MyPluginInterface2, ...)

现在,在您的实现中,您可以:

class MyPlugin1 : public QObject, public MyPluginInterface1

    Q_OBJECT
    Q_PLUGIN_METADATA(...)
    Q_INTERFACES(MyPluginInterface1)

signals:
    void mySignal() Q_DECL_FINAL;//make it final because signals cannot be overridden


class MyPlugin2 : public QObject, public MyPluginInterface2

    Q_OBJECT
    Q_PLUGIN_METADATA(...)
    Q_INTERFACES(MyPluginInterface2)

public slots:
    void mySlot() Q_DECL_OVERRIDE;

最后,在进行连接时

//...
MyPluginInterface1 *p1 = this->plugin1;//Just an example
MyPluginInterface2 *p1 = this->plugin2;

//since you know both inherit QObject, you can do:
QObject::connect(dynamic_cast<QObject*>(p1), SIGNAL(mySignal()),
                 dynamic_cast<QObject*>(p2), SLOT(mySlot()));

//...

请注意,Qt 不会为这些信号/插槽提供自动完成功能,您必须使用此(旧)语法连接它们。

提示:如果你想在你的接口中有信号,请理解信号不是虚拟的,它们不能被覆盖。但是,要将信号添加到您的界面,它必须是纯虚拟的。为避免错误,请始终使用 Q_DECL_FINAL 宏实现信号 - 这样可以防止您覆盖它们。

【讨论】:

我想我理解这个想法,但我得到了QObject::connect: Cannot connect (null)::mySignal() to (null)::mySlot()。有什么建议吗? 你的插件实现了 QObject 吗? (并且有 Q_OBJECT 宏)?因为这意味着动态转换返回 NULL 是的,我的插件派生自 QObject 并具有 Q_OBJECT 宏。不知道我现在是否明白了。 我在***.com/questions/36121270/…发布了一个相关问题 ***.com/questions/8993347/… 的答案中提出的替代方法会更好吗?

以上是关于插件之间的 Qt 管道数据的主要内容,如果未能解决你的问题,请参考以下文章

什么是 QT 插件?

Qt添加驱动——Qt数据库之添加MySQL驱动插件

Qt高级——Qt插件开发

Qt Designer 的自定义动作插件

如何在 静态编译的QT 5.5.1 中 使用数据库插件连接 ODBC(调用静态插件)

Qt添加驱动——Qt数据库之添加MySQL驱动插件