2016-02-19 168 views
0

我想創建一個類A的新實例,它繼承了從QObject派生的基類。如果類型位於命名空間中,QMetaObject :: newInstance會失敗

如果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

Docs說:「_類通常不是應用程序編程所必需的」。所以可能你不應該在應用程序編程中使用'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"