C++ Qt中两个插件的信号/插槽交互

C++ Qt中两个插件的信号/插槽交互,c++,qt,plugins,qt4,C++,Qt,Plugins,Qt4,所以基本上我有一个小应用程序,加载两个插件并连接它们。加载后的第一个插件创建一个没有任何标题的标签,该标签将添加到主窗口。第二个插件创建一个动作,该动作将被添加到菜单中。因此,我的应用程序只需加载这些插件并连接它们。我所说的连接它们是什么意思?我的意思是,标签插件包含一个插槽,可以修改标签的标题,动作插件声明了一个信号。应用程序应将动作插件信号与标签插槽连接。我不知道该怎么做。我的猜测是,实际的插件类实现是连接自定义信号和标准信号(触发)。但无论如何,我的应用程序并没有像我预期的那样工作。如何在

所以基本上我有一个小应用程序,加载两个插件并连接它们。加载后的第一个插件创建一个没有任何标题的标签,该标签将添加到主窗口。第二个插件创建一个动作,该动作将被添加到菜单中。因此,我的应用程序只需加载这些插件并连接它们。我所说的连接它们是什么意思?我的意思是,标签插件包含一个插槽,可以修改标签的标题,动作插件声明了一个信号。应用程序应
动作插件信号与标签插槽连接。我不知道该怎么做。我的猜测是,实际的插件类实现是连接自定义信号和标准信号(触发)。但无论如何,我的应用程序并没有像我预期的那样工作。如何在我的应用程序中正确连接一个插件的信号和另一个插件的插槽

以下是我的标签插件代码:

#include "LabelInterface.h"

class LabelPlugin : public LabelInterface {

    Q_OBJECT
    Q_INTERFACES(LabelInterface)

public:
    QLabel* label;
    QLabel* newLabel();
     LabelPlugin() {}
    ~LabelPlugin() {}

public slots:
    void setTextforLabel();
}; 

#include <QtGui>
#include "LabelPlugin.h"

QLabel* LabelPlugin::newLabel() {

    label = new QLabel("");
    return label;
}

void LabelPlugin::setTextforLabel() {

    label->setText("This plugin works fine");
}

// Exporta plugin-ul
Q_EXPORT_PLUGIN2 (labelplugin,LabelPlugin)
#包括“LabelInterface.h”
类LabelPlugin:公共LabelInterface{
Q_对象
Q_接口(标签接口)
公众:
QLabel*标签;
QLabel*newLabel();
LabelPlugin(){}
~LabelPlugin(){}
公众时段:
void setTextforLabel();
}; 
#包括
#包括“LabelPlugin.h”
QLabel*LabelPlugin::newLabel(){
标签=新的QLabel(“”);
退货标签;
}
void LabelPlugin::setTextforLabel(){
label->setText(“此插件工作正常”);
}
//Exporta插件
Q_导出_插件2(labelplugin,labelplugin)
动作插件:

    #include "ActionInterface.h"

    class ActionPlugin : public ActionInterface  {

        Q_OBJECT
        Q_INTERFACES (ActionInterface)

    public :
         QAction* myAction;
         QAction* newAction();

        ~ActionPlugin () {}
         ActionPlugin () {}

    public slots:
         void send_signal();

     signals :
         void pushMyAction();
    };

#include <QtGui>
#include "ActionPlugin.h"

QAction* ActionPlugin::newAction() {

    myAction = new QAction("Show text",this);

    return myAction;
}

void ActionPlugin::send_signal() {

    qDebug ()<<"Here";

    QAction::connect (this,SIGNAL(pushMyAction()),this,SIGNAL(triggered()));
}

Q_EXPORT_PLUGIN2 (actionplugin,ActionPlugin)
#包括“ActionInterface.h”
类ActionPlugin:PublicActionInterface{
Q_对象
Q_接口(ActionInterface)
公众:
QAction*myAction;
QAction*newAction();
~ActionPlugin(){}
ActionPlugin(){}
公众时段:
无效发送_信号();
信号:
void pushMyAction();
};
#包括
#包括“ActionPlugin.h”
QAction*ActionPlugin::newAction(){
myAction=新QAction(“显示文本”,this);
返回我的行动;
}
void ActionPlugin::send_signal(){
qDebug()newLabel());
}
如果(操作和标签){

qDebug()您需要能够从每个插件访问QObject实例,以便在连接调用中使用它。我将向您的接口添加方法来完成此操作。我看到的一种模式是将接口转换为QObject指针的运算符,如:

class MyInterface {
public:
    virtual operator QObject*() = 0;
};

对于这是否是一种好的样式,意见可能会有所不同,但它解决了问题(如果您不喜欢该运算符,请使用名为asQObject()或类似的方法)。

这可能不会有任何区别,但可以尝试
label->connect(\u action,SIGNAL(pushMyAction()))
您在控制台输出上没有收到任何连接错误吗?因为Qt5
Q\u EXPORT\u PLUGIN2
已被弃用。顺便说一下,我也遇到了同样的问题。有时您想
qobject\u cast
您的插件,总是需要先将它们转换为
qobject
,这可能会让人非常恼火。QPluginLoader::instance re将它们转换为QObject,我不明白为什么您需要将它们转换回QObject?因为一般来说,您将QObject_转换到您的界面并使用它,并且无法将其转换回QObject。您当然可以在任何地方传递QObject*和MyInterface*,但这也很尴尬。
class MyInterface {
public:
    virtual operator QObject*() = 0;
};