qml与C++的交互

简单说下我自己对qml与c++的交互的理解流程:

1.界面交互,很多新手可能会写qt界面或者qml界面,但想要把qml与c++结合起来就一脸蒙逼了。首先我提供个简单的方法实现qml和c++的界面交互,首先引入几个重要的头文件,当然在项目文件中需要加QT+= quickwidgets才能引用以下头文件

#include <QQuickWidget>
#include <QQuickView>
#include <QQmlContext>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    qmlWidget = new QQuickWidget(this);
    qmlWidget->rootContext()->setContextProperty("View",this);
    qmlWidget->setSource(QUrl(QStringLiteral("qrc:/Staute.qml")));
}

在构造函数里添加三句代码就让Widget界面和qml界面绑定在一起了,简单吧。温馨提示:不要忘了在析构函数中delete掉qmlWidget哦,否则重复运行程序会出现异常结束现象

简单叙述下个人拙见,第一句代码不用说是qml界面,第二句是为了把Widget界面用View表示,使得当前界面的属性能传入qml界面,简单说就是如果在qml文件中需要用到this的属性,使用View.属性就可以了。

第三句代码想必各位都理解,就是加载qml文档。把widge显示后界面就是你在qml文件编辑的界面了。需要注意的是qml文档要移到资源文件中去。

如果你想在qml里面使用Widget的函数或者是成员的话类似View.width;点后面加成员属性或者函数就可以了。需要注意的有几点:

想要将一个类或对象导出到qml中必须满足以下条件

1.从QObject或QObject的派生类继承

2.使用Q_OBJECT宏

Q_INVOKABLE宏

在定义一个类的成员函数时使用Q_INVOKABLE宏来修饰就可以让该方法被元对象系统调用,即可使用View.function这种方式访问c++函数。宏必须放在返回值类型前(最前面)

如果是槽函数则可以省略,因为槽函数本身能被元对象系统调用。

Q_PROPERTY宏用来定义可通过元对象系统访问的属性,通过它定义的属性可以在QML中访问、修改还可以在属性变化时发射特定的信号。这里给一个简单的示例:

Q_PROPERTY(int taskid READ returnTaskid WRITE setTaskid NOTIFY tidChange)

public:
int returnTaskid(){return taskid;}
void setTaskid(int id){taskid = id;emit tidChange();}
signals:
    void tidChange();
private:
    int taskid;

顺序是成员属性、成员属性的get方法、成员属性的set方法、成员属性数据变化时发出的信号

本人太懒就粗略介绍下,闲暇时再更新。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QMLC++ 交互的过程一般分为以下几个步骤: 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"` 的子对象。 以上就是 QMLC++ 交互的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值