Qtのでは、どのように私は多重継承でQ_OBJECTスロットと信号を使用していますか?

StackOverflow https://stackoverflow.com/questions/1489238

  •  18-09-2019
  •  | 
  •  

質問

私は関連の質問を通して見て、私が話していたまさに対処何かを見つけることなので、私が説明することはできませんでした。

私はのは、独自のスロットと信号を持っている必要がありFOOを言わせ、クラスを持っているだけでなく、QXmlDefaultHandlerから継承する必要があります(むしろ奇妙に聞こえるが、に直接ウェブサイトを読むためにQHttpを使用しようとすると、私はこのような状況に遭遇しましたQBuffer)。

class foo: public QXmlDefaultHandler, public QObject
{
    public:
        foo();
        ~foo();

       Q_OBJECT
   public slots:
       void bar();
}

このコードは、どこか信号にバーを接続するためのcppを伴う場合には、コンパイルされません。あなたはQObjectをがQXmlDefaultHandlerのメンバーではないの一部のメンバーに関するエラーを取得します。また、(上に行く!それを試してみてください!)あなたはQ_OBJECTを移動することはできませんか、他あなたはいくつかのことを実施していないためvtableのエラーが出ます。

(非常に単純な)修正のための私の答えを参照してください。私はあなたが私よりも優れてそれを説明すると思えば、私は受け入れ答えとしてあなたを投票楽しまされます。

編集:あなたはそれをよりよく説明できる場合は、++とQt cは獣医のために、答えを投稿してください。私はあなたが私よりも行うことができますので、もし他の誰かを助けてください、この情報を見てかなりの時間を費やしています。

役に立ちましたか?

解決

MOCのための

ドキュメント

多重継承の例では、QObjectのを提供するクラスが最初に表示されるべきであると述べて
  

あなたは多重継承を使用している場合は、   MOCは最初は継承されていることを前提としてい   クラスはQObjectをのサブクラスです。また、   最初の継承されたことを確認してください   クラスはQObjectをされます。

 // correct
 class SomeClass : public QObject, public OtherClass
 {
     ...
 };
     

QObjectを持つ仮想継承があります   サポートされていません。

他のヒント

class foo: public QObject, public QXmlDefaultHandler
{
    public:
        foo();
        ~foo();
   Q_OBJECT
   public slots:
       void bar();
}
あなたが最初の継承リストにはQObjectを入れていない場合は、

それは思ったほど簡単で、この作業は不可能です。これは、Qtのメタオブジェクトシステムの制限です。これを行わない場合、コンパイラはQXmlDefaultHandlerの一部としてはQObjectの一部のメンバーを適用しようとします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top