相关疑难解决方法(0)

如何在从QObject派生的类上正确使用qRegisterMetaType?

我一直在寻找答案,但无济于事.我的哀叹如下:

我有一个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禁止复制和赋值构造函数.因此,我不得不适用qRegisterMetaTypeClassA自己,但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)

c++ reflection qt

24
推荐指数
3
解决办法
3万
查看次数

标签 统计

c++ ×1

qt ×1

reflection ×1