基本的に私は2つのプラグインとconnect
をロードする小さなアプリケーションを持っています。最初のプラグインはロードされた後、メインウィンドウに追加されるタイトルなしのラベルを作成します。 2番目のプラグインは、メニューに追加されるアクションを作成します。だから、私のアプリは、これらのプラグインをロードしてconnect
にロードする必要があります。私はそれらを接続することによって何を意味するのですか?私は、ラベルのプラグインにはラベルのタイトルを変更するスロットがあり、アクションプラグインにはシグナルが宣言されていることを意味します。アプリケーションは、ラベルスロットを持つアクションプラグイン信号connect
です。私はそれを正確に行う方法を知らない。私の推測では、アクションプラグインクラスの実装では、トリガされた信号とカスタム信号を接続することです。しかし、とにかくこの方法私のアプリは私が期待どおりに動作していません。どのように私はプラグインとスロットから別のプラグインからの信号のために私のアプリで正しい接続を行うことができますか?ここでQtの2つのプラグインのシグナル/スロットの相互作用
は、ラベルのプラグインのために私のコードです:
#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)
、私が持っているプラグインをロードしよう:
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";
}
}
おそらく 'label _-> connect(_action、SIGNAL(pushMyAction())); ' –
コンソール出力で接続エラーが発生しませんか? –
Qt5 'Q_EXPORT_PLUGIN2'は推奨されていません。 – ManuelSchneid3r