2011-08-15 16 views
2

OK、私はQtとC++の両方に新しいことがあります。私はQMetaTypeを自分のクラスと一緒に使ってみようとしています。サブクラスを扱うことができません。ここで(申し訳ありませんが、問題のトンは、おそらくそこにいる)私が持っているものです。QMetaTypeと継承

testparent.h:

#include <QMetaType> 
#include "testparent.h" 

class Test1 : public TestParent 
{ 
public: 
    Test1(); 
    ~Test1(); 
    Test1(const Test1 &t); 
    int getSomething();   // int test1.cpp, just one line returning 67 
}; 

Q_DECLARE_METATYPE(Test1) 

...(ない限り:

#include <QMetaType> 

class TestParent 
{ 
public: 
    TestParent(); 
    ~TestParent(); 
    TestParent(const TestParent &t); 
    virtual int getSomething(); // in testparent.cpp, just one line returning 42 
    int getAnotherThing();  // in testparent.cpp, just one line returning 99 
}; 

Q_DECLARE_METATYPE(TestParent) 

そして、ここではtest1.hですここで宣言されているすべてのメンバーは、testparent.cppまたはtest1.cppに何もしない(単にカッコを入れ、ブラケットを閉じる)と定義されています)main.cpp:

#include <QtGui/QApplication> 
#include "test1.h" 
#include "testparent.h" 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    int id = QMetaType::type("Test1"); 

    TestParent *ptr = new Test1; 
    Test1 *ptr1 = (Test1*)(QMetaType::construct(id)); 
// TestParent *ptr2 = (TestParent*)(QMetaType::construct(id)); 

    qDebug() << ptr->getSomething(); 
    qDebug() << ptr1->getSomething();  // program fails here 
// qDebug() << ptr2->getAnotherThing(); 
// qDebug() << ptr2->getSomething(); 

    delete ptr; 
    delete ptr1; 
// delete ptr2; 

    return 0; 
} 

私はptr2でいくつかの多型をテストしようとしていましたが、ptr1が機能しないことに気付きました。 (EDIT:問題が解決されました(編集:nvmは意味をなさない))これを実行すると、最初のqDebugが67のように印刷され、数秒間スタックされてしまいます。コード-1073741819で終了します。

ありがとうございます。

答えて

5

タイプを登録する必要があります。マクロQ_DECLARE_METATYPEでは不十分です。 あなたは、main関数の開始時に1行が不足している:

qRegisterMetaType<Test1>("Test1"); 

今、あなたはゼロではないid(タイプが登録されていることを意味する)を取得することができますので、多くの

int id = QMetaType::type("Test1"); 
+0

感謝を!私は馬鹿だと感じる。 – JohnJamesSmith0