我有以下代码:
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一起使用。
答案 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 *
不是注册的元类型(默认情况下)。