2016-02-19 14 views
0

Я хочу создать новый экземпляр класса A, который наследует базовый класс, полученный от QObject.QMetaObject :: newInstance failes, если тип находится в пространстве имен

В случае 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 с пространствами имен?

+0

Документы говорят: «Этот класс обычно не требуется для программирования приложений». Поэтому, вероятно, вы не должны использовать 'QMetaObject' в своем прикладном программировании. –

+0

Можете ли вы вставить больше кода, связанного с вашими классами? – peppe

+0

@ HiI'mFrogatto И как это должно быть полезно? Я использую 'QMetaObject' все время. Вы заплатили за это, используйте его! –

ответ

0

Это определенно работает для меня под 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"