我正在Echo Plugin Example之后开发基于插件的应用。
到目前为止一切顺利。现在,我想在插件之间管道数据。我有一个使用QTcpSocket
建立网络连接的插件,我有另一个插件,我希望在QTextEdit
中显示数据。如何在插件之间传输数据?
如果两个简单的对象我都会做简单的信号槽连接,但由于插件的接口不是从QObject派生的,所以它不可能有信号槽。或者,至少我不知道如何。
答案 0 :(得分: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
宏实现信号 - 这可以防止您覆盖它们。