2017-06-12 11 views
3

QQmlContext::setContextProperty()を使用してqmlのカスタムクラスへのポインタを割り当てる必要があります。もう1つのqmlオブジェクトには同じタイプのQ_PROPERTYがあります。カスタムクラスポインタを持つQVariantが同じアドレスを返さない

単純なテストでは、変換が私の思ったようにうまくいかないことがわかりました。私は本当にQVariantにそれを変換した後、再び同じポインタを取得したいと思い

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

#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; 
} 

この小さなテストアプリケーションは、私にこのような出力を提供します。後でそれをqmlコンテキストに割り当てると、会話は正しく動作するはずです。

+0

を[ 'QVariant :: [値]](HTTP://doc.qt .io/qt-5/qvariant.html#value):* QVariantに格納されたポインタがTにqobject_castできる場合、その結果が返されます。それ以外の場合は、ヌルポインタが返されます。これは、Q_OBJECTマクロを使用するQObjectサブクラスでのみ機能することに注意してください。*ポインタを 'QVariant'に格納する場合は、' void * 'として格納する必要があります。 – thuga

+0

void *をQVariant-Typeとして使用する場合、qmlとのインタフェースのための 'Q_PROPERTY'は' TestClass * 'ですか?クラスが私によって書かれていないので、私はqmlを通して転送したいクラスにQ_OBJECTマクロを追加できません。 –

+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

コメントに記載されているように、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から派生したラッパーを使用できますか? –

関連する問題