C++和QML混合编程

这篇具有很好参考价值的文章主要介绍了C++和QML混合编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 一、QML访问C++方法

  1. Qt元对象系统中注册C++类,在QML中实例化、访问。
  2. C++中实例化并设置为QML上下文属性,在QML中直接使用。

           比较:方法1可以使C++类在QML中作为一个数据类型,例如函数参数类型或属性类型,也可以使用其枚举类型、单例等,功能更强大。

  • 二、QML访问C++条件

  1. 派生自QObject类或QObject类的子类
  2. 使用Q_OBJECT宏
  • 三、QML访问C++举例

                     使用方法1

信号与槽

 文章来源地址https://www.toymoban.com/news/detail-759972.html

#ifndef GEMINI_H  
#define GEMINI_H  
#include <QObject>  
#include <QDebug>  
class Gemini : public QObject  
{  
    Q_OBJECT  
signals:    //1、先定义“信号”
    void begin();   
public slots:  //1、先定义“槽”
    void doSomething() {  
        qDebug() << "Gemini::doSomething() called";  
    }  
};  
#endif 

 

#include <QGuiApplication>  
#include <QQmlApplicationEngine>  
#include <QtQml>  
#include <Gemini.h>  
int main(int argc, char *argv[])  
{  
    QGuiApplication app(argc, argv);  
    qmlRegisterType<Gemini>("Union.Lotto.Gemini", 1, 0, "Gemini");  //一.注册c++类
    QQmlApplicationEngine engine;  
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));  
    return app.exec();  
}
import QtQuick 2.2  
import QtQuick.Window 2.1  
import Union.Lotto.Gemini 1.0  //二.导入
Window {  
    visible: true  
    width: 360; height: 360  
    title: "Union Lotto Game"  
    color: "white"  
    MouseArea {  
        anchors.fill: parent  
        onClicked: {  
            gemini.begin()  //2.调用类信号
        }  
    }  
    Gemini {  
        id: gemini  
        onBegin: doSomething()  //2.调用类槽
    }  
}

 

 

                2、枚举类型

#ifndef GEMINI_H  
#define GEMINI_H  

#include <QObject>  
#include <QDebug>  
class Gemini : public QObject  
{  
    Q_OBJECT  
    Q_ENUMS(BALL_COLOR)  //1、先定义。枚举类型在QML中使用,就用到了Q_ENUMS()宏
public:  
    Gemini() : m_ballColor(BALL_COLOR_YELLOW) {  
        qDebug() << "Gemini::Gemini() called";  
    }  
    enum BALL_COLOR {  
        BALL_COLOR_YELLOW,  
        BALL_COLOR_RED,  
        BALL_COLOR_BLUE,  
        BALL_COLOR_ALL  
    };  
signals:  
    void begin();  
public slots:  
    void doSomething(BALL_COLOR ballColor) {  
        qDebug() << "Gemini::doSomething() called with" << ballColor;  
        if(ballColor != m_ballColor) {  
            m_ballColor = ballColor;  
            qDebug() << "ball color changed";  
        }  
    }  
private:  
    BALL_COLOR m_ballColor;  
};  
#endif 
import QtQuick 2.2  
import QtQuick.Window 2.1  
import Union.Lotto.Gemini 1.0  
Window {  
    visible: true  
    width: 360; height: 360  
    title: "Union Lotto Game"  
    color: "white"  
    MouseArea {  
        anchors.fill: parent  
        onClicked: {  
            gemini.begin()  
        }  
    }  
    Gemini {  
        id: gemini  
        onBegin: doSomething(Gemini.BALL_COLOR_RED)  //2.调用,在QML中使用枚举类型的方式是<CLASS_NAME>.<ENUM_VALUE>
    }  
}

 

                3、成员函数

 

#ifndef GEMINI_H  
#define GEMINI_H  

#include <QObject>  
#include <QDebug>  
class Gemini : public QObject  
{  
    Q_OBJECT  
    Q_ENUMS(BALL_COLOR)  
public:  
    Gemini() : m_ballColor(BALL_COLOR_YELLOW) {  
        qDebug() << "Gemini::Gemini() called";  
    }  
    enum BALL_COLOR {  
        BALL_COLOR_YELLOW,  
        BALL_COLOR_RED,  
        BALL_COLOR_BLUE,  
        BALL_COLOR_ALL  
    };  
    Q_INVOKABLE void stop() {  //1、定义。访问的前提是public或protected成员函数,且使用Q_INVOKABLE宏
        qDebug() << "Gemini::stop() called";  
    }  
signals:  
    void begin();  
public slots:  
    void doSomething(BALL_COLOR ballColor) {  
        qDebug() << "Gemini::doSomething() called with" << ballColor;  
        if(ballColor != m_ballColor) {  
            m_ballColor = ballColor;  
            qDebug() << "ball color changed";  
        }  
    }  
private:  
    BALL_COLOR m_ballColor;  
};  
#endif 

 

import QtQuick 2.2  
import QtQuick.Window 2.1  
import Union.Lotto.Gemini 1.0  
Window {  
    visible: true  
    width: 360; height: 360  
    title: "Union Lotto Game"  
    color: "white"  
    MouseArea {  
        anchors.fill: parent  
        onClicked: {  
            gemini.begin()  
            gemini.stop()  //2、调用,在QML中访问C++的成员函数的形式是<id>.<method>
        }  
    }  
    Gemini {  
        id: gemini  
        onBegin: doSomething(Gemini.BALL_COLOR_RED)  
    }  
}

 

 

                4、C++类的属性

 

#ifndef GEMINI_H  
#define GEMINI_H  

#include <QObject>  
#include <QDebug>  
class Gemini : public QObject  
{  
    Q_OBJECT  
    Q_ENUMS(BALL_COLOR)  
    Q_PROPERTY(unsigned int ballNumber READ ballNumber WRITE setBallNumber NOTIFY ballNumberChanged)  //1、定义,Q_PROPERTY()宏,用来在QObject派生类中声明属性。
public:  
    Gemini() : m_ballColor(BALL_COLOR_YELLOW), m_ballNumber(0) {  
        qDebug() << "Gemini::Gemini() called";  
    }  
    enum BALL_COLOR {  
        BALL_COLOR_YELLOW,  
        BALL_COLOR_RED,  
        BALL_COLOR_BLUE,  
        BALL_COLOR_ALL  
    };  
    unsigned int ballNumber() const {  
        return m_ballNumber;  
    }  
    void setBallNumber(const unsigned int &ballNumber) {  
        if(ballNumber != m_ballNumber) {  
            m_ballNumber = ballNumber;  
            emit ballNumberChanged();  
        }  
    }  
    Q_INVOKABLE void stop() {  
        qDebug() << "Gemini::stop() called";  
    }  
signals:  
    void begin();  
    void ballNumberChanged();  
public slots:  
    void doSomething(BALL_COLOR ballColor) {  
        qDebug() << "Gemini::doSomething() called with" << ballColor;  
        if(ballColor != m_ballColor) {  
            m_ballColor = ballColor;  
            qDebug() << "ball color changed";  
        }  
    }  
private:  
    BALL_COLOR m_ballColor;  
    unsigned int m_ballNumber;  
};  
#endif

 

import QtQuick 2.2  
import QtQuick.Window 2.1  
import Union.Lotto.Gemini 1.0  
Window {  
    visible: true  
    width: 360; height: 360  
    title: "Union Lotto Game"  
    color: "white"  
    MouseArea {  
        anchors.fill: parent  
        onClicked: {  
            gemini.begin()  
            gemini.stop()  
            gemini.ballNumber = 10  //2、调用,Gemini类中的ballNumber属性可以在QML中访问、修改,访问时调用了ballNumber()函数,
// 修改时调用了setBallNumber()函数,同时还发送了一个信号来自动更新这个属性值。
} } Gemini { id: gemini onBegin: doSomething(Gemini.BALL_COLOR_RED) onBallNumberChanged: console.log(
"new ball number is", ballNumber) // 10 Component.onCompleted: console.log("default ball number is", ballNumber) // 0 } }

 

备注:1、参考网址:https://zhuanlan.zhihu.com/p/633999343

           2、本文只为个人学习笔记,其他第三方可以任意使用。

 

到了这里,关于C++和QML混合编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++(Qt)与Python混合编程

    文章开头,请大家注意一点: 开始搭配环境之前,请大家完成对自己电脑位数的查看【32位/64位】 本篇博客适用于windows64位版本安装。当然了,32位的友友也可以对照着配置! 本篇教程所用环境如下: windows11(64位) Qt 6.4 Python 3.8.6 【由于本人已安装python版本为3.8.6,不想重

    2024年01月24日
    浏览(32)
  • Python 和 C++ 混合编程:pybind11 使用

    我们通常在 Python 上进行算法开发,因为 Python 编程方便,易于快速验证算法。而在验证算法正确后,如果对运行效率有更高要求的话,则会将计算密集的模块使用 C/C++ 重新实现,来达到代码运行效率加速的效果。所以,这就涉及到了 Python 和 C++ 混合编程,而在这方面 pybin

    2024年02月08日
    浏览(32)
  • visual stdio c++调用python混合编程

    关于环境创建可以参考https://blog.csdn.net/qq_36559788/article/details/123174309 这里python我用的是anaconda里的python38 ,并且没有debug库,所以我只用了release库 在vs中设置项目属性,添加 包含目录 以及 附加库目录 ,注意都是在release模式下添加的 在main.cpp中添加头文件 添加代码 编译运行

    2024年02月01日
    浏览(33)
  • QT Quick之quick与C++混合编程

            Qt quick能够生成非常绚丽界面,但有其局限性的,对于一些业务逻辑和复杂算法,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,所以就有了quick和C++混合编程的需求。

    2024年02月12日
    浏览(30)
  • C++ 混合Python编程 及 Visual Studio配置

    接手了一个C++应用程序,解析csv和生成csv文件,但是如果要把多个csv文件合并成一个Excel,分布在不同的Sheet中,又想在一次运行中完成,不想说运行完C++ 的App后,再调用一个Python脚本或程序,这需要两步操作 根据安装的Visual Studio 的版本,我安装的是64-bit的。 如何查看当前

    2024年02月13日
    浏览(33)
  • CUDA和C++混合编程及CMakeLists.txt

    首先认识一个问题,单从CMakeLists.txt的角度来看,无法同时使用两种编译器编译两种语言。不过直接编写Makefile是可以的,通过设置不同的任务,可以实现一个Makefile编译两个语言。但这不是这里要讨论的重点。 使用CUDA和C++进行混合编程的意思是:在cpp文件中调用CUDA函数,实

    2024年02月11日
    浏览(31)
  • Qt第十六章:QWidget与QML混合开发

    目录 一、Qml作为窗口引入 二、Qml作为控件引入(Qml根组件不能是window) 三、两个问题①Qml文件如何调用python函数②python代码如何控制Qml元素。 一、Qml作为窗口引入 例:QWidget窗口中用按钮 打开和关闭Qml窗口 ①QWidget窗口 ②Qml窗口 注意:此处是直接引入qml文件。如果是从q

    2024年02月16日
    浏览(32)
  • 【QT】C++和QML使用多线程优化界面切换卡顿的方法

    qt提供了一种声明式语言qml,可以使用一些可视组件以及这些组件之间的交互来描述用户界面,而c++可以只负责后台逻辑的处理,将界面和后台分离开来,由qml来做UI界面,c++负责后端处理,对我个人来说,这样的方式大大的方便了对界面和逻辑的修改和维护; 由于UI界面是工

    2024年01月19日
    浏览(34)
  • VB6 注册表的递归访问与面象对象模块化封装

    1)较低层次的封装 “过程化模块封装” 模块: Module1包含windows API 注册表相关函数声明 及少量的 GetValue、SetValue函数等浅封装。 2)较高层次的封装 基于面向对象:类模块CEnumReg定义属性、方法、事件。 核心方法 EnumAll(hkey As Long, ByVal subkey As String) 1.该方法的作用递归枚举指

    2024年02月02日
    浏览(28)
  • C++面向对象编程(2)

    目录 一. 问题引入 二. 右值引用 1. lvalue/rvalue/prvalue/xvalue 1.1 表达式与对象的概念 1.2 左值与右值  2. moving semantics 2.1 显示绑定 2.2 Move constructors 2.3 Move assignment operator 2.4 实例分析 // TODO Quiz REF 本章简单介绍下move语义的“来龙去脉”。 如下,先来看看拷贝赋值的一个过程。

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包