如何将 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 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

QVariant保存指针数据

QListWidgetItem设置获取指针型数据

QWidget对象设置获取指针型属性数据

Swinject:如何将委托模式与接口隔离(类与接口)一起使用?

如何将 'afterColumnResize' 事件与 'rhandsontable' 一起使用?

如何将 Quickblox 与 angularjs 集成?