Javaから書き直されたかなり複雑なC++クラスのセットがあります。したがって、各クラスには1つの継承されたクラスがあり、1つ以上の抽象クラス(またはインターフェイス)も実装します。
qobject_cast()
を使用してクラスからインターフェイスの1つに変換することは可能ですか?すべてのインターフェースをQObject
から派生させると、QObject
参照があいまいなためにエラーが発生します。ただし、QObject
から継承された基本クラスしかない場合は、QObject
sで動作するため、qobject_cast()
を使用できません。
プラグインとそれらのインターフェースによって参照されるDLLの間でクラスをスローできるようにしたいと思います。
いくつかの調査と読書の後 qobject_castドキュメント 、私はこれを見つけました:
qobject_cast()は、インターフェースと組み合わせて使用することもできます。詳細については、プラグアンドペイントの例を参照してください。
例へのリンクは次のとおりです: Plug&Paint 。
例で interfaces header を掘り下げた後、私は Q_DECLARE_INTERFACE マクロを見つけました。
まず、インターフェースからQObject
を継承しない。使用しているすべてのインターフェースについて、次のようなQ_DECLARE_INTERFACE宣言を使用します。
class YourInterface
{
public:
virtual void someAbstractMethod() = 0;
};
Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0")
次に、クラス定義で、次のように Q_INTERFACES マクロを使用します。
class YourClass: public QObject, public YourInterface, public OtherInterface
{
Q_OBJECT
Q_INTERFACES(YourInterface OtherInterface)
public:
YourClass();
//...
};
このすべてのトラブルの後、次のコードが機能します。
YourClass *c = new YourClass();
YourInterface *i = qobject_cast<YourInterface*>(c);
if (i != NULL)
{
// Yes, c inherits YourInterface
}