QMetaType и наследование - PullRequest
       37

QMetaType и наследование

3 голосов
/ 15 августа 2011

ОК, так что я новичок в Qt и C ++.Я пытаюсь использовать QMetaType со своими собственными классами, и я не могу заставить его работать с подклассами.Вот что у меня есть (вероятно, куча проблем, извините):

testparent.h:

#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:

#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)

... (Если не указано иное, все объявленные здесь члены определены как ничего не делать (просто открывающая скобка, закрывающая скобка) в 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: предыдущее предложение не имеет смысла. О, хорошо, проблема решена (EDIT: nvm имеет смысл)) Что происходит, когда я запускаю, это первый qDebug печатает 67, как и ожидалось, и затем он застревает на несколько секунд ив конце концов выходит с кодом -1073741819.

Большое спасибо.

1 Ответ

6 голосов
/ 15 августа 2011

Тип должен быть зарегистрирован! Макро Q_DECLARE_METATYPE недостаточно. Вам не хватает одной строки в начале основной функции:

qRegisterMetaType<Test1>("Test1");

теперь вы можете получить id, который не равен нулю (что означает, что тип зарегистрирован):

int id = QMetaType::type("Test1");
...