如何将 QVariant::fromValue 与 QString 一起使用?
Posted
技术标签:
【中文标题】如何将 QVariant::fromValue 与 QString 一起使用?【英文标题】:How to use QVariant::fromValue with QString? 【发布时间】:2015-12-14 22:45:46 【问题描述】:我有以下代码:
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), Message)
我不认为我应该使用Q_DECLARE_METATYPE
代替QString
,因为如果我这样做:
engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(QString("data to QML")));
效果很好。
我对如何将 QVariant::fromValue()
与预先声明的 QString 一起使用感兴趣。
【问题讨论】:
不要在堆上分配QString
,完全没有意义。
我只是在测试如何连接QML和c++端,没有关注其他的东西。
【参考方案1】:
QVariant::fromValue()
需要 QString
,而不是指向 QString
的指针。
此外,在堆上分配QString
对象没有多大意义。在后台,QString
使用写时复制 (COW) 作为优化;无论如何,QString
中存储的实际数据将始终在堆上。
【讨论】:
我只是在测试这不是一个有效的代码,QString
将由QSerialPort
填充。
啊啊啊,你的猫身上的面具太棒了。 :D(好的,将其标记为“太健谈”)【参考方案2】:
data
是指向QString
的指针,而不是QString
本身。要使用QVariant::fromValue()
方法,您必须取消引用指针:
engine.rootContext()->setContextProperty(QStringLiteral("consoleText"), QVariant::fromValue(*data));
^
这是因为 QString *
不是注册的元类型(默认情况下)。
【讨论】:
以上是关于如何将 QVariant::fromValue 与 QString 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
Swinject:如何将委托模式与接口隔离(类与接口)一起使用?