IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Qt Quick中QML和C++混合编程详解1——将C++类或对象导出到QML中(在qml中即可访问该类的实例的属性或者方法) -> 正文阅读

[C++知识库]Qt Quick中QML和C++混合编程详解1——将C++类或对象导出到QML中(在qml中即可访问该类的实例的属性或者方法)

一、将类或对象导出到QML中-----可供QML访问的类(在qml中即可访问该类的实例的属性或者方法)

1、信号与槽
把C++对象的信号连接到QML定义的方法上,也可以把QML对象的信号连接到C++对象的槽上,也可以直接调用C++对象的信号或者槽

class ColorMaker : public QObject  
{  
    Q_OBJECT  
  
public:  
    ColorMaker(QObject *parent = 0);  
    ~ColorMaker();  
      
signals:  
    void colorChanged(const QColor & color);  
    void currentTime(const QString &strTime);  
  
public slots:  
    void start();  
    void stop();  
      
}; 

我们定义了 start() / stop() 两个槽, colorChanged() / currentTime() 两个信号,都可以在 QML 中使用

2、Q_INVOKABLE宏
在定义一个类的成员函数时使用 Q_INVOKABLE 宏来修饰,就可以让该方法被元对象系统调用。这个宏必须放在返回类型前面。

一旦你使用 Q_INVOKABLE 将某个方法注册到元对象系统中,在 QML 中就可以用 O b j e c t . {Object}. Object.{method} 来访问,colorMaker 的 main.qml 中有使用 algorithm() 和 setAlgorithm() 的 QML 代码

class ColorMaker : public QObject  
{  
    Q_OBJECT  
  
public:  
    ColorMaker(QObject *parent = 0);  
    ~ColorMaker();  
      
    Q_INVOKABLE GenerateAlgorithm algorithm() const;  
    Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);  
  
signals:  
    void colorChanged(const QColor & color);  
    void currentTime(const QString &strTime);  
  
public slots:  
    void start();  
    void stop();  
};
Component.onCompleted: {  
    colorMaker.color = Qt.rgba(0,180,120, 255);  
    colorMaker.setAlgorithm(ColorMaker.LinearIncrease);  
    changeAlgorithm(colorAlgorithm, colorMaker.algorithm());  
} 

3、Q_PROPERTY
Q_PROPERTY 宏用来定义可通过元对象系统访问的属性,通过它定义的属性,可以在 QML 中访问、修改,也可以在属性变化时发射特定的信号。要想使用 Q_PROPERTY 宏,你的类必须是 QObject 的后裔,必须在类首使用 Q_OBJECT 宏。

class QQuickText : public QQuickImplicitSizeItem  
{  
    Q_OBJECT  
    Q_ENUMS(HAlignment)  
  
  
    Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)  
    Q_PROPERTY(QFont font READ font WRITE setFont NOTIFY fontChanged)  
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)  
    ...  
      
public:  
    enum HAlignment { AlignLeft = Qt::AlignLeft,  
                       AlignRight = Qt::AlignRight,  
                       AlignHCenter = Qt::AlignHCenter,  
                       AlignJustify = Qt::AlignJustify };  
    ...  
    QString text() const;  
    void setText(const QString &);  
  
    QFont font() const;  
    void setFont(const QFont &font);  
  
    QColor color() const;  
    void setColor(const QColor &c);  
    ...  
};  
Q_PROPERTY(type name  
           (READ getFunction [WRITE setFunction] |  
            MEMBER memberName [(READ getFunction | WRITE setFunction)])  
           [RESET resetFunction]  
           [NOTIFY notifySignal]  
           [REVISION int]  
           [DESIGNABLE bool]  
           [SCRIPTABLE bool]  
           [STORED bool]  
           [USER bool]  
           [CONSTANT]  
           [FINAL])  

我们在实际使用中,很少能够用全 Q_PROPERTY 的所有选项,就往 QML 导出类这种场景来说,比较常用的是 READ / WRITE / NOTIFY 三个选项。我们来看看都是什么含义。
【1】READ 标记,如果你没有为属性指定 MEMBER 标记,则 READ 标记必不可少;声明一个读取属性的函数,该函数一般没有参数,返回定义的属性。
【2】WRITE 标记,可选配置。声明一个设定属性的函数。它指定的函数,只能有一个与属性类型匹配的参数,必须返回 void 。
【3】NOTIFY 标记,可选配置。给属性关联一个信号(该信号必须是已经在类中声

4、Q_ENUMS
如果你要导出的类定义了想在 QML 中使用枚举类型,可以使用 Q_ENUMS 宏将该枚举注册到元对象系统中。

一旦你使用 Q_ENUMS 宏注册了你的枚举类型,在 QML 中就可以用 C L A S S N A M E . {CLASS_NAME}. CLASSN?AME.{ENUM_VALUE} 的形式来访问,比如 ColorMaker.LinearIncrease ,上节展示的 QML 代码片段已经使用了导出的枚举类型。

class ColorMaker : public QObject  
{  
    Q_OBJECT  
    Q_ENUMS(GenerateAlgorithm)  
  
public:  
    ColorMaker(QObject *parent = 0);  
    ~ColorMaker();  
      
    enum GenerateAlgorithm{  
        RandomRGB,  
        RandomRed,  
        RandomGreen,  
        RandomBlue,  
        LinearIncrease  
    };  
      
    Q_INVOKABLE GenerateAlgorithm algorithm() const;  
    Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);  
  
signals:  
    void colorChanged(const QColor & color);  
    void currentTime(const QString &strTime);  
  
public slots:  
    void start();  
    void stop();  
};  
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:48:45  更:2021-09-19 07:50:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:40:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码