2016-03-20 6 views
0

Echo Plugin Exampleに続いて、プラグインに基づいてアプリを開発しています。Qtプラグイン間でデータをパイプする

これまでのところとても良いです。今私はプラグイン間でデータをパイプしたいと思っています。 QTcpSocketを使用してネットワーク接続を確立するプラグインが1つあり、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, ...) 

今、あなたの実装では、あなたが実行します。接続

//... 
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())); 

//... 

を行う場合、最終的

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; 
} 

とを、ということに注意してくださいQtはこれらの信号/スロットのオートコンプリートを提供せず、この(古い)synを使用してそれらを接続する必要があります税金。

ヒント:インターフェイスに信号を入れたい場合、信号は仮想ではなく、上書きすることはできません。ただし、インターフェイスに信号を追加するには、純粋な仮想でなければなりません。エラーを回避するには、Q_DECL_FINALマクロを使用してシグナルを実装します。これにより、オーバーライドできなくなります。

+0

私はこのアイデアを理解していると思いますが、 'QObject :: connect :(null):: mySignal()を(null):: mySlot()'に接続できません。すべてのヒント? – KcFnMi

+0

あなたのプラグインはQObjectを実装していますか? (そしてQ_OBJECTマクロを持っていますか?)これは、動的キャストがNULLを返したことを意味するので、 – Felix

+0

はい、私のプラグインはQObjectから派生し、Q_OBJECTマクロを持っています。私が今考えたら分かりません。 – KcFnMi