Qtのでは、どのように私は多重継承でQ_OBJECTスロットと信号を使用していますか?
質問
私は関連の質問を通して見て、私が話していたまさに対処何かを見つけることなので、私が説明することはできませんでした。
私はのは、独自のスロットと信号を持っている必要があり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をのサブクラスです。また、 最初の継承されたことを確認してください クラスは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の一部のメンバーを適用しようとします。