29.qt quick-在QML中调用C++类

  • 源码已上传至专栏群(第一章底部获取)中,感兴趣的自行下载、
    入群需验证订阅用户名,尽量选择"订阅专栏"、"学习会员"会验证失败

1.Qml调用C++类

  • Qt QML模块提供了一组API,用来将C++类扩展QML中。
  • 您可以编写扩展来添加自己的QML类型,扩展现有的Qt类型,或调用无法从普通QML代码访问的C/C++函数
  • 本章将学习如何使用C++类编写QML扩展,其中包括属性、QML function和属性绑定等
  • 为了方便大家理解,本章示例的函数实现能写在头文件,就写在头文件.

2.创建QML

将C++类扩展QML时,一般用来实现QML目前无法实现的功能,比如访问系统信息,文件信息等。

本章demo是显示一个简单的饼图,创建一个C++类提供给QML使用

这里导入一个"import Charts 1.0"模块,然后创建一个名为"PieChart"的QML类型,该类型具有两个属性:name和color。

import QtQuick.Window 2.12
import Charts 1.0

Window {
    visible: true
    width: 640
    height: 480
    PieChart {
        width: 100; height: 100
        name: "A simple pie chart"
      
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Qt ,可以通过在 QML 使用 `Qt.createQmlObject()` 或者 `Qt.createComponent()` 创建一个 C++ 对象,然后在 QML 调用该对象的方法或者访问其属性。 具体步骤如下: 1. 在 C++ 定义一个 QObject 的子,并在其声明 Q_INVOKABLE 的方法或者 Q_PROPERTY 的属性。 ```cpp // MyObject.h #ifndef MYOBJECT_H #define MYOBJECT_H #include <QObject> class MyObject : public QObject { Q_OBJECT public: explicit MyObject(QObject *parent = nullptr); Q_INVOKABLE void myMethod(QString str); Q_PROPERTY(QString myProperty READ myProperty WRITE setMyProperty NOTIFY myPropertyChanged) void setMyProperty(const QString &str); QString myProperty() const; signals: void mySignal(); void myPropertyChanged(); }; #endif // MYOBJECT_H ``` ```cpp // MyObject.cpp #include "MyObject.h" MyObject::MyObject(QObject *parent) : QObject(parent) { } void MyObject::myMethod(QString str) { qDebug() << "myMethod called with arg" << str; } void MyObject::setMyProperty(const QString &str) { if (m_property != str) { m_property = str; emit myPropertyChanged(); } } QString MyObject::myProperty() const { return m_property; } ``` 2. 在 main.cpp 将该对象注册到 QML ,以便在 QML 访问。 ```cpp // main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "MyObject.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; qmlRegisterType<MyObject>("com.mycompany.myobject", 1, 0, "MyObject"); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 3. 在 QML 使用 `Qt.createComponent()` 或者 `Qt.createQmlObject()` 创建该对象,并调用其方法或者访问其属性。 ```qml // main.qml import QtQuick 2.0 import com.mycompany.myobject 1.0 Rectangle { width: 400 height: 400 MyObject { id: myObject myProperty: "Hello, World!" Component.onCompleted: { myObject.myMethod("Hello, World!"); console.log(myObject.myProperty); } } } ``` 在上述代码,我们使用 `MyObject` 创建了一个名为 `myObject` 的对象,并调用了它的 `myMethod` 方法和 `myProperty` 属性。 需要注意的是,使用 `Qt.createComponent()` 或者 `Qt.createQmlObject()` 创建对象时,必须指定该对象的父对象,否则该对象将无法正常工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺谦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值