qml调用c++

4 篇文章 0 订阅
3 篇文章 0 订阅

一、将c++对象注册到qml引擎中:

   方法有很多种,这里只介绍下面这几种:

 1.将c++类型导出为qml可以使用的类型 

#include <QtQml>
#include <QQmlApplicationEngine>
...

...

//注册一定要放在qml上下文之前
//qmlRegisterType<对象名>("自定义的包名",主版本号,次版本号,"qml中的对象名");
qmlRegisterType<MyListModoule>("an.qt.ListModoule",1,0,"MyMoDoule");
...

 2.将c++中创建的对象作为属性传递到qml中

#include <QQmlApplicationEngine>
#include <QQmlContext>

...
QQmlApplicationEngine engine;
//必须在load之前调用,new出来的对象还需要c++这边释放
engine.rootContex()->setContextProperty("test_qml",new Test);

engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

...

 在qml中使用是,不需要像第一种方法 import,也不需要定义,可直接使用test_qml,类似于一种在qml中的单例对象。

 

二、c++类的定义

      如果想要在qml中访问c++的类,必须先满足以下两点前置条件:

  •           该类必须是QObject类的子类 
  •           使用Q_OBJECT宏

      满足上述条件后,只要具有以下特征之一,即可被qml访问:

1. 信号、槽

           只要是signals 和 slots定义的函数,都可以直接在qml中访问到

2. 使用了Q_INVOKABLE宏声明的函数

  例如:

Q_INVOKABLE int GetValue();
Q_INVOKABLE void SetValue(int val);

   一旦使用了Q_INVOKABLE宏,那么就可以在qml中使用${Object}.${method}来访问了

3. 使用Q_ENUMS宏

   Q_ENUMS宏可以将类中枚举类型注册到元对象系统中

class Test : public QObject{
    Q_OBJECT
    Q_ENUMS(Number)

public:
    enum Number{
        kOne = 1,
        kTwo,
        kThree,
        kFour
    };
};
        

这样就可以在qml中,直接使用${CLASS_NAME}.${ENUM_VALUE}的形式访问枚举变量了,如Test.kOne

4. Q_PROPERTY宏

   Q_PROPERTY 宏用来定义可通过元对象 系统访问的属性。

  常用选项有READ、WRITE、NOTIFY。

Q_PROPERTY(type name [READ getFunction] [WRITE setFunction] [NOTIFY changeSingle])

Q_PROPERTY(int value READ GetValue WRITE SetValue NOTIFY valueChanged)

  Q_PROPERTY还有其他很多选项,但是都不常用。 

  定义了Q_PROPERTY宏的属性,可以在qml中通过READ对应的函数来获取属性值,通过WRITE属性对应的值来设置属性,通过关联NOTIFY抛出的信号来处理属性的改变。 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt QML是一种基于JavaScript的声明式语言,用于快速构建跨平台的用户界面。它有时需要与C++代码交互,因为C++可以提供更高性能和更底层的功能。 要在Qt QML调用C函数,需要进行以下步骤: 1. 创建一个继承自QObject的C++类,并在其中定义所需的函数。这些函数需要使用Q_INVOKABLE宏进行标记,以便在QML调用。 ```cpp // MyFunctions.h #include <QObject> class MyFunctions: public QObject { Q_OBJECT public: explicit MyFunctions(QObject *parent = nullptr); Q_INVOKABLE void myFunction(); }; ``` 2. 在QML文件中导入C++类,并使用其实例调用函数。 ```qml import MyFunctions 1.0 Window { // ... Button { text: "调用C函数" onClicked: { MyFunctions.myFunction(); } } // ... } ``` 3. 在C++代码中将该类注册到QML引擎中。 ```cpp // main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "MyFunctions.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<MyFunctions>("MyFunctions", 1, 0, "MyFunctions"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 通过以上步骤,就可以在Qt QML中成功调用C函数了。在按钮点击事件中调用C++类的函数,可以在C++代码中执行所需的操作,并将结果返回到QML界面中进行展示。这种方式可以实现Qt QML框架与C++高性能功能的结合,使得开发者能够更好地发挥Qt的优秀特性和灵活性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值