插件之间的 Qt 管道数据

Qt piping data between plugins

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

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

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

实际上,信号槽是可能的。您所要做的就是将您的插件转换为 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 不会为那些 signals/slots 提供自动完成功能,您必须使用此(旧)语法连接它们。

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