2012-01-24 4 views
5

基本的に私は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"; 
     } 
    } 
+0

おそらく 'label _-> connect(_action、SIGNAL(pushMyAction())); ' –

+0

コンソール出力で接続エラーが発生しませんか? –

+0

Qt5 'Q_EXPORT_PLUGIN2'は推奨されていません。 – ManuelSchneid3r

答えて

3

ますそれぞれのプラグインからQObjectインスタンスにアクセスできるようにする必要があります。そのため、接続コールで使用できます。私はあなたのインターフェイスにこれを行うメソッドを追加します。私が見た一つのパターンは次のように、QObjectをポインタにインタフェースを変換する演算子です:

class MyInterface { 
public: 
    virtual operator QObject*() = 0; 
}; 
あなたは演算子を好きではない場合(つまり、良いスタイルだが、それは問題を解決するかどうかにより異なる可能性があり

意見asQObject()などのメソッドを使用します。

+0

ちなみに私は同じ問題に遭遇しました。時々、あなたのプラグインを 'qobject_cast'したいと思うことがあります。最初に' QObject'にそれらをキャストする必要があり、非常に迷惑になることがあります。 – pmr

+0

QPluginLoader :: instanceはそれらをQObjectsとして返しますが、QObjectにキャストする必要があるのはなぜですか? –

+0

一般的に、あなたはあなたのインターフェイスにqobject_castingしてそれを使用するので、QObjectに戻すことはできません。もちろん、QObject *とMyInterface *をどこでも渡すことができますが、それはやっかいです。 –

関連する問題