13

私の Qt アプリケーションには、次のような基本クラスがあります。すべての派生クラスで Signal-Slot メカニズムを使用QObjectしたいので、使用しています。

class IRzPlugin : public QObject {

public:
  virtual void registerMenu(QWidget*);
  virtual void execute();
}

次に、次のような別のクラスがあります。すべての派生クラス ( など)でQWidgetイベント処理メソッドを実装する必要があるため、から拡張する必要があります。mouseMoveEvent()keyPressEvent()

class IRzLayeringPlugin : public IRzPlugin , public QWidget{

}

しかし、コンパイラはこれらのエラーを出します:

C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const':
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin'
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1
4

2 に答える 2

8

現在の化身ではQObject、派生クラス (IRzLayeringPluginクラスなど) の複数の継承パスで使用することはできません。QObject私がこれまでに見た唯一の解決策は、継承なしでインターフェイス クラスを作成することでしたが、使用する関数に直接対応する関数を使用してから、特定のクラスでインターフェイスと他のクラス継承QObjectの間のブリッジを実装します。QObjectそれはかなり早く醜くなります。

于 2010-07-08T17:02:31.050 に答える
8

今日ここに同様の質問がありました。

基本的に、次の 2 つが必要です。

  • Q_DECLARE_INTERFACEインターフェイス クラス宣言の後に追加する
  • Q_INTERFACESクラスのマクロにインターフェースを追加する

この後、qobject_cast はインターフェイスで動作します。

インターフェイスからシグナルとスロットを使用したい場合は、QObject から派生した型でしか使用できないため、うまくいきません。ただし、この場合、常に'QObject' is an ambiguous base of 'IRzLayeringPlugin'エラーが発生します。

この場合、@Caleb のアイデアは依然として最高です。

于 2010-09-16T13:52:56.600 に答える