web-dev-qa-db-ja.com

Qtインターフェイスまたは抽象クラスとqobject_cast()

Javaから書き直されたかなり複雑なC++クラスのセットがあります。したがって、各クラスには1つの継承されたクラスがあり、1つ以上の抽象クラス(またはインターフェイス)も実装します。

qobject_cast()を使用してクラスからインターフェイスの1つに変換することは可能ですか?すべてのインターフェースをQObjectから派生させると、QObject参照があいまいなためにエラーが発生します。ただし、QObjectから継承された基本クラスしかない場合は、QObjectsで動作するため、qobject_cast()を使用できません。

プラグインとそれらのインターフェースによって参照されるDLLの間でクラスをスローできるようにしたいと思います。

23

いくつかの調査と読書の後 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
}
30
Venemo