插件之间的 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 管道数据的主要内容,如果未能解决你的问题,请参考以下文章