1

我有以下代码:

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(Condition, Message) static_assert(bool(Condition) , 信息)

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

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

它工作正常。

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

4

2 回答 2

4

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

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

于 2015-12-14T22:54:04.130 回答
1

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

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

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

于 2015-12-14T22:54:14.567 回答