在 qml 中调用 .cpp 中函数不便
通过此种方式调用的类,在 Qt Creator 中,调用时会遇到一些问题。
例如,在 serialTerminal 中,存在 openSerial 函数:
在 qml 中调用时:
1.首先无法由函数转到定义。
2.其次,当函数的实际参数与定义的参数不匹配时,程序在编译、调试时均无法明显的看出,但函数会直接跳过执行。(qt以某种方式决定调用 openSerialPortSlot 重载,并将 baud 参数设置为 0)
3.Qt creator 对 qml 的 UI 支持并不好,修改代码的实时显示会有问题。
下图是个参数错误但无法检测出的例子:
下图是 UI 显示的问题:
尝试解决方案1:
采用其他的 C++ 和 qml 的交互方式。
A.使用 qmlRegisterType 将 C++ 注册为 qml 的类:
此方法通过 qmlRegisterType 方法将 SerialTerminal 类注册为 SerialEXP 库,并在 qml 中以 SPExample 的形式调用,如下图所示:
缺点是方法通常用于定义控件,需要通过实例化来调用其中的函数,而不能直接通过类调用函数(也许定义成虚函数可以?)。导入和使用如下图所示:
当参数不匹配时,程序在编译调试时依旧无法检查出,但程序总会执行(执行时通过某种方式忽略参数不匹配的影响)。(利用 try-catch + 返回值的方式勉强可以使用)
如果真的在 Qt Creator 中使用,需要尽量将在 qml 中的逻辑写的简单,最好一个事件只调用一个函数,且函数具有返回值能判断是否正确执行。
尝试解决方案2:
采用 VS 作为开发 Qt 的 IDE。
尝试解决方案3:
使用 Qt widget 进行开发。
补充:在 C++ 中修改 QML 同样不便
下文代码希望在 C++ 中修改 QML 中 IMG 的值,但是在每次修改时,总会弹出新窗口,无法解决。
网友评论