使用C 访问QT / 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(..),但是如何访问对象的方法。"查看器"是一个文本方面,我想首先做一个selectall(),然后是一个cut()清除盒子。

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

当然不会编译,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/前端。

作者的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

使用Invoke方法在此处使用发布的答案,这是有效的解决方案:

// 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()
}

最新更新