Qt中两个插件的信号/插槽交互 [英] Signal/Slot interaction for two plugins in Qt
问题描述
所以基本上,我有一个加载两个插件并connect
的小应用程序.加载后的第一个插件将创建一个没有任何标题的标签,该标签将被添加到主窗口.第二个插件创建一个动作,该动作将添加到菜单中.所以我的应用程序只需要加载这些插件并connect
即可.我将它们连接起来是什么意思?我的意思是,标签插件包含一个插槽,该插槽将修改标签的title,并且动作插件具有声明的信号.应用程序应connect
带有标签槽的动作插件信号.我不知道该怎么做.我的猜测是,在实际中,插件类的实现是将自定义信号与标准信号(触发)连接起来.但是无论如何,这样我的应用程序无法按我预期的那样工作.我该如何在我的应用中为来自一个插件的信号和来自另一个插件的插槽建立正确的连接?
So basically i have a little application that loads two plugins and connect
them. First plugin after it's loaded it creates a label without any title which will be added to main window. Second plugin creates an action which will be added to a menu. So my app need just to load these plugins and to connect
them . What i mean by connecting them ? i mean that label plugin contains a slot which will modify label's title , and action plugin has a signal declared. Application should connect
action plugin signal with label slot. I do not know how to do it exactly. My guess is that in action plugin class implementation is to connect custom signal with a standart signal (triggered). But anyway this ways my app is not working as i expected. How can i make a correct connection in my app for a signal from one plugin and slot from another plugin ??
这是我的标签插件代码:
Here is my code for Label Plugin :
#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)
动作插件:
#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)
在我的应用程序中,我尝试加载我拥有的插件:
In my app , where i try to load plugins i have :
foreach (QString fileName, appDir.entryList(QDir::Files)) {
qDebug()<<QString(fileName);
QPluginLoader pluginLoader(appDir.absoluteFilePath(fileName));
QObject* plugin = pluginLoader.instance();
if (plugin) {
ActionInterface* myAction= qobject_cast<ActionInterface*>(plugin);
if (myAction) {
action_ = myAction;
pluginMenu->addAction(action_->newAction());
}
LabelInterface* myLabel = qobject_cast<LabelInterface*>(plugin);
if (myLabel) {
label_=myLabel;
layout->addWidget(label_->newLabel());
}
if (action_ && label_) {
qDebug()<<"both loaded";
action_->send_signal();
connect(action_, SIGNAL(pushMyAction()),label_, SLOT(setTextforLabel()));
}
else qDebug() << "seems one plugin is not loaded";
}
}
推荐答案
您需要能够从每个插件访问QObject实例,以便可以在connect调用中使用它.我会向您的接口添加方法来执行此操作.我看到的一种模式是将接口转换为QObject指针的运算符,例如:
You need to be able to access a QObject instance from each plugin so you can use it in the connect call. I would add methods to your interfaces to do this. One pattern I've seen is an operator to convert the interface to a QObject pointer, like:
class MyInterface {
public:
virtual operator QObject*() = 0;
};
关于样式是否好,可能有不同的看法,但这可以解决问题(如果您不喜欢运算符,请使用asQObject()或类似方法).
Opinions may vary on whether that's good style, but it solves the problem (if you don't like the operator, use a method called asQObject() or similar).
这篇关于Qt中两个插件的信号/插槽交互的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!