我一直在寻找答案,但无济于事.我的哀叹如下:
我有一个ClassA大致如下:
class ClassA : public QObject {
Q_OBJECT
public:
ClassA() { mName = "lol"; }
~ClassA();
void ShowName() { std::cout << mName << std::endl; }
std::string mName;
};
Run Code Online (Sandbox Code Playgroud)
当然,因为我使用moc,这个类实际上在我的项目中被分成cpp和hpp,但这部分不是问题.
请注意,我不会Q_DECLARE_METATYPE故意使用,因为我现在实际上并不需要它的功能(QVariant扩展).我只关心运行时实例化.
这里的问题是Q_OBJECT禁止复制和赋值构造函数.因此,我不得不适用qRegisterMetaType于ClassA自己,但ClassA*乍一看似乎工作得很好.
现在,我想在运行时从字符串动态创建此类并运行该方法ShowName().我是这样做的:
int main() {
qRegisterMetaType<ClassA*>("ClassA*");
int id = QMetaType::type("ClassA*");
std::cout << "meta id: " << id << std::endl; // Outputs correct generated user id (not 0)
ClassA* myclass = static_cast<ClassA*>(QMetaType::construct(id));
myclass->ShowName(); // Segfaults, oh …Run Code Online (Sandbox Code Playgroud)