带有自定义类指针的QVariant不会返回相同的地址

fee*_*0de 4 qt qvariant qt5

我需要在qml中使用指定自定义类的指针QQmlContext::setContextProperty().另一个qml对象具有Q_PROPERTY相同的类型,可以再次检索它.

一个简单的测试表明转换不像我想象的那样有效.

#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;
}
Run Code Online (Sandbox Code Playgroud)

这个小小的测试应用程序给我一个这样的输出:

metaTypeId = 1024
TestClass::TestClass()
0x1b801e0 QVariant(TestClass*, ) 0x0
Run Code Online (Sandbox Code Playgroud)

我真的希望在将其转换为a之后再次获得相同的指针QVariant.稍后我会将它分配给qml上下文,然后对话必须正常工作.

thu*_*uga 9

这对我来说使用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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出:

1024 1024 1025 1025
0x81fca50 0x81fca50 0x81fca60 0x81fca60
Run Code Online (Sandbox Code Playgroud)


Sil*_*ker 5

正如在评论中提到@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;
}
Run Code Online (Sandbox Code Playgroud)