gpt4 book ai didi

c++ - 如果类型在命名空间中,QMetaObject::newInstance 会失败

转载 作者:行者123 更新时间:2023-11-28 05:49:50 26 4
gpt4 key购买 nike

我想创建类 A 的新实例,它继承了派生自 QObject 的基类。

如果 A 不在命名空间中,这可以正常工作,但如果 A 在命名空间中,则此调用返回空指针:

QObject *o = metaObject->newInstance(arg1,arg2,arg3);

metaObject 本身返回正确的类名(包括命名空间)

std::cout << "Class name from staticMetaObject: " << metaObject->className() << std::endl;

A 的构造函数用Q_INVOKABLE 标记。如何将 QMetaObject::newInstance 与命名空间一起使用?

最佳答案

它在 Qt 5.5.1 下绝对适合我。

也许您的基类缺少 Q_OBJECT 宏。

// https://github.com/KubaO/stackoverflown/tree/master/questions/ns-meta-35505644
#include <QtCore>

int A_a, B_a;

class A : public QObject {
Q_OBJECT
public:
Q_INVOKABLE A(int a, QObject * parent = 0) : QObject{parent} {
A_a = a;
}
};

namespace NS {
class B : public A {
Q_OBJECT
public:
Q_INVOKABLE B(int a, QObject * parent = 0) : A{a, parent} {
B_a = a;
}
};
}

int main() {
Q_ASSERT(A_a == 0);
Q_ASSERT(B_a == 0);
QScopedPointer<QObject> a {A::staticMetaObject.newInstance(Q_ARG(int, 10))};
Q_ASSERT(A_a == 10);
QScopedPointer<QObject> b {NS::B::staticMetaObject.newInstance(Q_ARG(int, 20))};
Q_ASSERT(A_a == 20);
Q_ASSERT(B_a == 20);
QScopedPointer<QObject> c {b->metaObject()->newInstance(Q_ARG(int, 30))};
Q_ASSERT(A_a == 30);
Q_ASSERT(B_a == 30);
}

#include "main.moc"

关于c++ - 如果类型在命名空间中,QMetaObject::newInstance 会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com