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

标签 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(..),但是您如何访问对象的方法。 “查看器”是一个 TextArea,我想先执行 selectAll(),然后执行 cut() 以清除框。

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

最佳答案

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

如果它是 C++ 函数,您必须将 qobject_cast 转换为具有它的适当类型。然而,对于许多用 C++ 实现的库存 QML 类型,这并不总是很容易获得,并且作为 C++ 类型,它们不是公共(public) API 的一部分,通常不打算由最终用户直接使用。

如果它是一个 JS 函数,你将不得不使用 QMetaObject::invokeMethod。这也适用于已为其生成元数据的 C++ 函数。这也是 setProperty() 的工作方式,而 setColor() 不能像 append()< 那样与 QObject* 一起工作 没有。

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

可以这样想 - 汽车使用发动机,发动机不使用汽车。发动机控制是通过启动键和 throttle 踏板连接的,不能直接使用。 C++ 的东西应该保留给应用程序引擎——高性能或效率核心逻辑,或后端,而 QML 部分用于 GUI/前端。

关于c++ - 使用 C++ 访问 Qt/QML 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42654745/

相关文章:

java - 将第一个元素作为 Null 添加到队列中

c++ - Qlist适合在服务中使用?

python - PyQt4无法导入Qsci

c++ - Qt:如何调整图像大小并保持其比例?

javascript - 对象不返回最大数量 - JS

javascript - AHK GUI DateTime 默认设置

java - 从 C++ 回调到 Java

c++ - Windows 上的 Clang 和 CMake - clang.exe 损坏,程序不可执行

python - 如何在 "decorator"对象中实现 "class"功能?

ios - 从其他类调用方法(自身问题)