C++/Qtのクラスでミックスを使用して、一連のウィジェット全体に共通のインターフェースを提供しようとしています。インターフェースは、他のウィジェットクラスの基本クラスとして定義されている場合、ウィジェット自体がこれらのシグナルを持つように定義されています。
_class SignalInterface: public QObject {
Q_OBJECT
public:
SignalInterface();
virtual ~SignalInterface();
signals:
void iconChanged(QIcon);
void titleChanged(QString);
}
class Widget1: public SignalInterface, QWidget{
public:
Widget1()
virtual ~Widget1()
// The Widget Should Inherit the signals
}
_
クラス階層を見ると問題が明らかになり、_Widget1
_がQWidget
とSignalInterface
から継承し、どちらもQObject
から継承する、多重継承の恐ろしいひし形に偶然遭遇しました。これにより問題が発生しますか?
この問題は、QObject
クラスが純粋に仮想である場合(そうでない場合)に簡単に解決できることがわかっています。
可能な解決策は次のとおりです。
_class Interface: public QWidget {
Q_OBJECT
signals:
void IconChanged(QIcon);
void titleChanged(QString);
}
class Widget1: public Interface {
}
_
ここでの問題は、QWidget
を継承するコードがすでにたくさんあり、それをハックするのが面倒なことです。別の方法はありますか?
残念ながらQObject
を2回継承すると、moc
で問題が発生します。
多重継承を使用している場合、mocは最初に継承されたクラスがQObjectのサブクラスであると想定します。また、最初に継承されたクラスのみがQObjectであることを確認してください。
デリゲートパターンのようなものを使用するか、IsA関係ではなくHasAで再作成することをお勧めします。
基本クラスがQObjectからprivatelyを継承する場合、Qtは多重継承を許可します。
例:
class Base: private QObject {
Q_OBJECT
/*Can use signals and slots like any other QObject-derived class*/
};
class Derived1: public Base {
/*Cannot use signals/slots because it does not "see" that Base inherits from QObject*/
};
class Derived2: public QWidget, public Base {
Q_OBJECT
/*Can use signals/slots plus has all the functionality of QWidget and Base*/
};
もちろん、私的な継承はまったく別の動物であり、本当に必要な解決策をあなたに与えないかもしれません。私がそれを使用するのは、基本クラスでのみ信号/スロットを使用することを回避できる場合です。派生クラスでQObject
の動作が本当に必要な場合は、そのクラス専用にQObject
から継承します。