実際には、信号スロットが可能です。プラグインを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
マクロを使用してシグナルを実装します。これにより、オーバーライドできなくなります。
私はこのアイデアを理解していると思いますが、 'QObject :: connect :(null):: mySignal()を(null):: mySlot()'に接続できません。すべてのヒント? – KcFnMi
あなたのプラグインはQObjectを実装していますか? (そしてQ_OBJECTマクロを持っていますか?)これは、動的キャストがNULLを返したことを意味するので、 – Felix
はい、私のプラグインはQObjectから派生し、Q_OBJECTマクロを持っています。私が今考えたら分かりません。 – KcFnMi