我正在开发一个最终将与串口通信的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()来清除该框。
这里的问题是这是如何编码的?谢谢大家。
答案 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