2

インターフェイスでシグナルを定義する方法は?

class ISomeInterface
{
    signals:
        virtual void added(const QString& id) = 0;
        virtual void removed(const QString& id) = 0;

    // bla, other methods
}

Afaik、信号は仮想であってはなりませんが、インターフェイスを実装するクラスで信号を実装する必要があることを定義したい場合 => これを行う方法は? それとも、単純にそれらを非抽象化しますか...しかし、インターフェイスには Q_OBJECT 宣言がありません! この場合、正しいコードが生成されますか? その上...シグナルに接続したい場合は、 QObject への悪い (f* * *g) キャストが必要です。

class ISomeInterface
{
    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

それとも、そのように実装しようとしていますか?

class ISomeInterface : public QObject
{
    Q_OBJECT

    signals:
        void added(const QString& id);
        void removed(const QString& id);

    // bla, other methods
}

Q_DECLARE_INTERFACE(ISomeInterface, "ISomeInterface")

..しかし、この方法では、1 つのインターフェイスからしか継承できません (QObject は多重継承をサポートしていません)。

結論: 示唆されているように、最初のものを使用します。

4

2 に答える 2

2

残念ながら、Qt は QObject からの多重継承を処理しないため (この Q&Aを参照)、そこからすべてのインターフェイスを派生させることはできません (そうしないと、複数のインターフェイスから派生できなくなります)。代わりに、とのIQObjectインターフェースのようなものがあるかもしれません

virtual QObject* qObject() = 0

メソッドなので、常に QObject にキャストする必要はありません。

シグナルのインターフェースを提供することに関しては、そのようなことはありません。できることは、それらを仮想抽象化することです。これは、このコンパイル時のチェックを本当に強制する必要がある場合に機能します (signals:は単に のエイリアスであるためprotected:)。そうでない場合は、connect()メソッドからの戻り値を確認してください。

于 2013-09-11T13:38:50.813 に答える