好的,所以我对 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 甚至不起作用。 (编辑:上一句毫无意义。哦,问题解决了(编辑:nvm 确实有意义))当我运行它时会发生什么,这是第一个 qDebug 打印 67,正如预期的那样,然后它卡住了几秒钟,然后最终以代码 -1073741819 退出。
非常感谢。
最佳答案
类型必须注册!宏 Q_DECLARE_METATYPE
是不够的。
您在 main 函数的开头缺少一行:
qRegisterMetaType<Test1>("Test1");
现在您可以获得不为零的
id
(这意味着该类型已注册):int id = QMetaType::type("Test1");
关于c++ - QMetaType 和继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7061416/