使用C ++访问Qt / QML对象

时间:2017-03-07 17:39:52

标签: c++ qt object qml

我正在开发一个最终将与串口通信的C ++ Qt项目。其中一部分是访问C ++部分中的QML对象。我有可以设置QML属性的代码,但现在访问那些方法的功能让我感到难过。查看以下代码:

object = view.rootObject();

rect = object->findChild<QObject *>("box");
rect->setProperty("color", "red");                  // Verifies the object tree is accessible
viewer = object->findChild<QObject *>("viewer");    // Access the viewer text box

viewer->append("dummy text");           // OOPS! This doesn't compile!!!

现在,类型作为方法setProperty(..),但是如何访问对象的方法。 &#34;观察者&#34;是一个TextArea,我想首先做一个selectAll(),然后一个cut()来清除该框。

这里的问题是这是如何编码的?谢谢大家。

3 个答案:

答案 0 :(得分:3)

当然它无法编译,QObject没有append()方法。

如果它是C ++函数,则必须qobject_cast到具有它的相应类型。然而,对于许多在C ++中实现的库存QML类型而言,这并不总是可用的,并且作为C ++类型,它们不是公共API的一部分,通常不打算供最终用户直接使用。

如果是JS函数,则必须使用QMetaObject::invokeMethod。这也适用于已生成元数据的C ++函数。这也是setProperty()的工作原理,而setColor()不适用QObject*append()则不行。

最后但并非最不重要的是,你完全没有理由从C ++做这些事情。使用C ++中的QML对象是糟糕的设计和反模式。你只会养成试图这样做的坏习惯。这种交互必须限于使用信号,槽和属性的明确定义的接口。一般来说,QML可以进入C ++,因为这只能通过暴露的接口发生,但是相反的方式,即使可能,也不应该使用。

想想这样 - 汽车使用发动机,发动机不使用汽车。并且发动机控制通过起动钥匙和油门踏板连接,不直接使用。应该将C ++内容保留给应用程序引擎 - 高性能或高效率的核心逻辑或后端,而QML部分则用于GUI /前端。

答案 1 :(得分:0)

使用调用方法在这里使用发布的答案,这是有效的解决方案:

// C++ Code to call function reset()
QMetaObject::invokeMethod(object, "reset");

// QML code to select all text the delete it
function reset() {
    viewer.selectAll()
    viewer.cut()
}

答案 2 :(得分:0)

作者的QML部分可能会公开别名属性以使用所需的文本字段内容:

import QtQuick 2.0
import QtQuick.Controls 1.2

Item {
    property alias viewerText: viewer.text // added

    width: 350
    height: 450
    TextArea {
        id: viewer
        x: 8
        y: 8
        width: 223
        height: 415
        text: "text"
        font.pixelSize: 12
        objectName: "viewer"
    }
    Button {
        id: open
        x: 251
        y: 8
        text: "Open"
    }
}

然后作者的C ++部分可以很容易地做到:

auto* object = view.rootObject();    
viewer = object->findChild<QObject *>("viewer");
viewer->setProperty("viewerText", "dummy text"); // using the new property added