2017-06-12 76 views
3

我需要使用QQmlContext::setContextProperty()爲qml中的自定義類指定一個指針。另一個qml對象具有相同類型的Q_PROPERTY以再次檢索它。帶自定義類指針的QVariant不返回相同的地址

一個簡單的測試表明,轉換不像我想象的那樣工作。

#include <QCoreApplication> 
#include <QDebug> 
#include <QMetaType> 

class TestClass 
{ 
public: TestClass() { qDebug() << "TestClass()::TestClass()"; } 
}; 

Q_DECLARE_METATYPE(TestClass*) 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    qDebug() << "metaTypeId =" << qMetaTypeId<TestClass*>(); 

    auto testObject = new TestClass; 
    QVariant variant(qMetaTypeId<TestClass*>(), testObject); 
    auto test = variant.value<TestClass*>(); 

    qDebug() << testObject << variant << test; 

    return 0; 
} 

這個微小的測試應用程序,讓我這樣的輸出:

metaTypeId = 1024 
TestClass::TestClass() 
0x1b801e0 QVariant(TestClass*,) 0x0 

我真的想將它歸結爲一個QVariant後再次獲得相同的指針了。稍後我會將其分配給qml上下文,然後該對話必須正常工作。

+0

['的QVariant :: value'(HTTP://doc.qt .io/qt-5/qvariant.html#value):*如果存儲在QVariant中的指針可以被qobject_cast爲T,那麼返回該結果。否則,返回空指針。請注意,這僅適用於使用Q_OBJECT宏的QObject子類。*如果要將指針存儲在'QVariant'中,則必須將其存儲爲'void *'。 – thuga

+0

如果我將使用void *作爲QVariant-Type,那麼用於與qml接口的'Q_PROPERTY'仍然是一個'TestClass *'?我不能將Q_OBJECT宏添加到我想通過qml傳輸的類中,因爲該類不是由我編寫的。 –

+0

將對象傳遞給不是爲其設計的QML的目標是什麼? – m7913d

回答

3

這對我的作品使用Qt 5.9:

#include <QVariant> 
#include <QDebug> 

class CustomClass 
{ 
public: 
    CustomClass() 
    { 
    } 
};  
Q_DECLARE_METATYPE(CustomClass*) 

class OtherClass 
{ 
public: 
    OtherClass() 
    { 
    } 
}; 
Q_DECLARE_METATYPE(OtherClass*) 

int main() 
{ 
    CustomClass *c = new CustomClass; 
    OtherClass *o = new OtherClass; 
    QVariant v; 
    v.setValue(c); 
    QVariant v2; 
    v2.setValue(o); 

    qDebug() << v.userType() << qMetaTypeId<CustomClass*>() << v2.userType() << qMetaTypeId<OtherClass*>(); 
    qDebug() << v.value<CustomClass*>() << c << v2.value<OtherClass*>() << o; 

    return 0; 
} 

和輸出我得到:

1024 1024 1025 1025 
0x81fca50 0x81fca50 0x81fca60 0x81fca60 
+0

添加qRegisterMetaType後,這對我有用 –

1

正如評論中提到的@thuga,您需要使用void*static_cast以及QVariant::fromValue

#include <QCoreApplication> 
#include <QDebug> 
#include <QMetaType> 

class TestClass 
{ 
public: TestClass() { qDebug() << "TestClass()::TestClass()"; } 
}; 

Q_DECLARE_METATYPE(TestClass*) 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    qDebug() << "metaTypeId =" << qMetaTypeId<TestClass*>(); 

    auto testObject = new TestClass; 
    QVariant variant(QVariant::fromValue(static_cast<void*>(testObject))); 
    auto test = static_cast<TestClass*>(variant.value<void*>()); 

    qDebug() << testObject << variant << test; 

    return 0; 
} 
+0

我可以使用Qobject提供的包裝嗎? –