如何将QVariant :: fromValue与QString一起使用?

时间:2015-12-14 22:45:46

标签: c++ qt qml qvariant

我有以下代码:

QString* data = new QString("data to QML");
engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(data));

并且这个不起作用,QTCreator中的错误消息如下:

  

... \ qglobal.h:693:错误:静态断言失败:类型未注册,请使用Q_DECLARE_METATYPE宏将其识别   到Qt的元对象系统        #define Q_STATIC_ASSERT_X(条件,消息)static_assert(bool(条件),消息)

我认为我不应该Q_DECLARE_METATYPE使用QString,因为如果我这样做的话:

engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(QString("data to QML")));

它工作正常。

我感兴趣的是如何将QVariant::fromValue()与预先声明的QString一起使用。

2 个答案:

答案 0 :(得分:3)

QVariant::fromValue()需要QString,而不是指向QString的指针。

此外,在堆上分配QString对象没有多大意义。在幕后,QString使用写时复制(COW)作为优化;无论如何,存储在QString中的实际数据总是在堆上。

答案 1 :(得分:1)

data是指向QString的指针,而不是QString本身。要使用QVariant::fromValue()方法,必须取消引用指针:

engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(*data));
                                                                                            ^

这是因为QString *不是注册的元类型(默认情况下)。