如何从main.cpp获取qml中的activeFocusItem属性?

时间:2015-11-26 08:23:40

标签: qt properties qml

我正在寻找一种方法来检索不属于C ++基类型的qml项属性。 我发现了这个:

QWindow *w = (QWindow *)engine.rootObjects().first();
QVariant p = w->property("color");

但结果是QVariant的一个实例。我想获得像activeFocusItem这样的属性。

1 个答案:

答案 0 :(得分:0)

实际上,如果您对activeFocusItem使用所需的toT()函数,则可以获得QVariant的值。

在你的情况下它应该是

QQuickWindow *w = (QQuickWindow*) engine.rootObjects().first();
qDebug() << w->activeFocusItem()->property("activeFocus").toBool(); // true obviously
qDebug() << w->activeFocusItem()->property("objectName").toString();

在此代码中,我们获取了属性activeFocusobjectName,但它只是一个示例。

另一种方式,

QQuickWindow *w = (QQuickWindow*) engine.rootObjects().first();
QQuickItem *wi = w->property("activeFocusItem").value<QQuickItem*>();
qDebug() << wi->property("activeFocus").toBool();
qDebug() << wi->property("objectName").toString();

根据documentation

  

因为C ++禁止工会包含具有非默认值的类型   构造函数或析构函数,最有趣的Qt类不可能   在工会中使用。没有QVariant,这将是一个问题   QObject :: property()和数据库工作等

通常,您使用信号与C ++交互。在这种情况下,当QML对象类型用作信号参数时,参数应使用var作为类型,并且应使用QVariant类型在C ++中接收值。更多信息和示例here

所以QVariant是必要的,正如我之前所说的那样,正确的方法是在Q ++中使用QML对象。

我是uploaded GitHub的完整示例。我希望这对你有帮助。