QML与C++交互

QML的开发初衷是为了更好的描绘界面,以便实现软件的逻辑和绘图的分离,但Qt开发小组显然在这点上非常不照顾用户,尽管QML绘图的文章一大把,但是逻辑和绘图交互的部分资料不仅难找,而且比较杂,这无疑给想用C++写逻辑,QML绘图,主打安卓等移动平台的开发者带来巨大的灾难。同时Digia在推出Qt5后,对QML进行了不少修改,原有的Qt4资料很多已经成废品,所以还是必须整理一份新的C++&QML的设计模式嘀~


1. 在QML使用C++对象

①首先得把C++对象注入到QML的Viewer里面去
#include <QQmlEngine>
#include <QQmlContext>
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QtQuick2ApplicationViewer viewer;
    MyObject *item=new MyObject;
    viewer.engine()->rootContext()->setContextProperty("MyObj",item);
}
这样所有通过Viewer的QML文件都可以访问这个C++对象了。

②想要调用C++对象的函数,只有俩种方式,一个是声明函数的类型前面加上Q_INVOKABLE宏(作用是添加跨线程访问权限,- -#) 另一种是把函数设为槽函数(了解Qt多线程的朋友可能知道,槽函数默认就有跨线程访问的权限)

Q_INVOKABLE void changeValue(int x);
//MyObj.changeValue(3) 旧版资料里会有这种写法,Qt5中是不行的,函数调用必须由QML触发,蛋疼,跪求大神指导。
onClicked:MyObj.changeValue(3) //貌似只能这么用

这里可能有朋友照葫芦画瓢了,把成员变量打上Q_INVOKABLE宏不就能在QML里访问了吗?呵呵,这是行不通的。想要访问C++变量的方法目前也只有俩个,一种是写个函数来访问/修改变量,另一种是在外部把对象的成员变量注入到Viewr里面去(比较蛋疼,慎用)。

QML C++ 交互的过程一般分为以下几个步骤: 1. 定义 C++ 类并注册到 QML 中 你需要在 C++ 中定义一个类,该类封装了你想要实现的功能。同时,你需要使用 `qmlRegisterType` 函数将该类注册到 QML 中,以便在 QML 中使用该类。 例如,你可以定义一个名为 `MyClass` 的类,并将其注册到 QML 中: ```cpp class MyClass : public QObject { Q_OBJECT public: Q_INVOKABLE int myFunction(int arg) { // 实现你的功能 } }; qmlRegisterType<MyClass>("com.example", 1, 0, "MyClass"); ``` 在上面的代码中,`Q_INVOKABLE` 用于声明 `myFunction` 函数可从 QML调用,`qmlRegisterType` 函数用于将 `MyClass` 类注册到 QML 中。`"com.example"` 表示注册的命名空间,`1` 和 `0` 表示主版本号和次版本号,`"MyClass"` 是在 QML 中使用的类名。 2. 在 QML 中使用 C++ 类 在 QML 中使用 C++ 类时,你需要使用 `import` 语句导入该类所在的命名空间。然后,你可以通过该命名空间来访问该类。例如: ```qml import com.example 1.0 MyClass { id: myClass } Button { onClicked: { var result = myClass.myFunction(42) // 处理返回值 } } ``` 在上面的代码中,`import` 语句用于导入 `com.example` 命名空间,`MyClass` 用于创建一个 `MyClass` 实例,`id` 属性用于设置实例的标识符,`Button` 用于创建一个按钮,`onClicked` 事件处理程序中调用了 `myFunction` 函数,并处理了它的返回值。 3. 在 C++ 中访问 QML 中的对象 如果你需要从 C++ 中访问 QML 中的对象,你可以使用 `QQuickItem` 类提供的 `findChild` 函数。例如: ```cpp QQuickItem *item = qmlEngine.rootObjects().value(0)->findChild<QQuickItem*>("myItem"); if (item) { // 处理 item 对象 } ``` 在上面的代码中,`qmlEngine.rootObjects()` 函数返回 QML 引擎中所有的根对象,`value(0)` 返回第一个根对象,`findChild` 函数用于查找名为 `"myItem"` 的子对象。 以上就是 QML C++ 交互的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值