简述

Qml要访问C++的内容,需要先从C++把要访问的内容注册进Qml。
先说说能用哪些:
注册过后,Qml中可以访问的内容,包括 Q_INVOKABLE 修饰的函数、枚举、 QObject的属性 信号 槽
Q_INVOKABLE 函数可以用在普通的结构体或者类中,但是这种用法不常见/不方便。常见的是在QObject的子类中,给非槽函数设置为Q_INVOKABLE。QObject的属性 信号 槽,都是可以通过注册后,在qml中使用的。信号、槽都可以带参数,槽可以有返回值。
这里要说的是,属性、函数参数、返回值的类型,都需要是Qml能识别的类型。
Qt的常用类型已经在Qt内部注册好了,自定义的需要单独注册。再说说怎么用:
注册分为两种:注册类型和注册实例。

注册类并使用

qmlRegisterType<类>("导入模块名“,主版本号,次版本号,"模块名称”)

qmlRegisterType<ZhouJing>("myZhou",1,0,"ComZhou");

类的头文件

#ifndef ZHOUJING_H
#define ZHOUJING_H#include <QObject>class Zhou : public QObject
{Q_OBJECT
public:explicit Zhou(QObject *parent = nullptr);Q_INVOKABLE void sing(); //invok函数,可以被Qml调用。可以带参数和返回值
public slots://打游戏,参数为次数,返回值为得分int playGame(int count);    //槽函数,可以被Qml调用。可以带参数和返回值
signals://想吃东西函数void hungry(const QString &foodName); //信号,可以被Qml接收到
};#endif // ZHOUJING_H

类的源文件:

#include "zhoujing.h"
#include <QDebug>Zhou::Zhou(QObject *parent): QObject{parent}
{}void Zhou::sing()
{qDebug()<<"小周在唱歌告白气球:";
}int Zhou::playGame(int count)
{int num = count;return num;
}

main.cpp文件:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "zhou.h"int main(int argc, char *argv[])
{#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;qmlRegisterType<Zhou>("myZhou",1,0,"ComZhou");const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

qml文件:

import QtQuick 2.15
import QtQuick.Window 2.15
import myZhou 1.0
import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")ComZhou{id: zjonHungry: {  //给信号写个槽函数if(foodName =="蛋炒饭")console.log("小周要吃蛋炒饭")else if(foodName == "面条")console.log("小周要吃面条")}}Button {onClicked: {//这个按钮按下的时候,涛哥开始唱歌tao.sing();}}Button {onClicked: {//这个按钮按下的时候,周靖开始打游戏zj.sing();zj.hungry("面条");let score = zj.playGame(23);console.log("小周打游戏次数",4,"得分为", score)}}
}

注册实例并使用

Zhou obj;     //C++中创建的实例//如果用QQ'u'ic'kView加载Qml
QQuickView view;
...
view.rootContext()->setContextProperty("obj", &obj);    //注意这个名字不要用大写字母开头,规则和Qml中的id不能用大写字母开头一样。//如果用QQmlEngine加载Qml
QQmlEngine engine;
...
engine..rootContext()->setContextProperty("obj", &obj); //注意这个名字不要用大写字母开头,规则和Qml中的id不能用大写字母开头一样。
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "zhoujing.h"int main(int argc, char *argv[])
{#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;Zhou obj;
//    qmlRegisterType<Zhou>("myZhou",1,0,"ComZhou");engine.rootContext()->setContextProperty("obj",&obj);const QUrl url(QStringLiteral("qrc:/main.qml"));QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,&app, [url](QObject *obj, const QUrl &objUrl) {if (!obj && url == objUrl)QCoreApplication::exit(-1);}, Qt::QueuedConnection);engine.load(url);return app.exec();
}

qml文件:

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")Connections{target: obj   //指定targetonHungry: {  //给信号写个槽函数if(foodName =="蛋炒饭")console.log("小周要吃蛋炒饭")else if(foodName == "面条")console.log("小周要吃面条")}}Button {onClicked: {//这个按钮按下的时候,涛哥开始唱歌obj.sing();}}Button {onClicked: {//这个按钮按下的时候,周靖开始打游戏obj.sing();obj.hungry("面条");let score = obj.playGame(23);console.log("小周打游戏次数",4,"得分为", score)}}
}

QML学习之QML与C++交互,Qml访问C++(三)相关推荐

  1. Qt之QML学习(一)——初步认识QML

    前言 约莫有两个星期没有写点什么,之前一直用qt,但最近项目又需要用到qml的内容,说实话从qt4.0之后出现的qml就没有去看过,那时候觉得新出来的东西不好用,知道5.9之后QT官方腰杆直起来了,说 ...

  2. Qml学习笔记:cpp与qml的交互调用方式

    Qml学习笔记:cpp与qml的交互调用方式 如何用在cpp中调用qml的方法 main.qml main.cpp 如何在qml中调用C++的方法函数 main.cpp main.qml 如何使用qm ...

  3. Qt6.2+QtDS的多功能串口助手(QML学习)

    开发平台:Qt 6.2 + Qt Design Studio 3.2.0 编译环境:MinGW 11.2.0 64bit --release 主要内容:Qt Quick Application载入QM ...

  4. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  5. QML学习【一】Basic Types

      QML入门教程(1) QML是什么? QML是一种描述性的脚本语言,文件格式以.qml结尾.语法格式非常像CSS(参考后文具体例子),但又支持javacript形式的编程控制.它结合了QtDesi ...

  6. 【QML学习 01】 SystemTrayIcon 状态栏图标

    QML SystemTrayIcon (状态栏图标) 系列QML学习笔记 参考:https://blog.csdn.net/qq_28171461/article/details/88797900 通 ...

  7. QML学习【一】QML语言基础

    QML语言基础 首先我们要理解QML语言是什么,我们可以了联想C++与STL的关系来理解QML与Qt Quick的关系.QML是一种说明性语言,支持ECMAScript表达式.如果说你有学习过QT那么 ...

  8. QML学习 QML文件当做组件使用

    QML学习:QML文件当做组件使用 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 参考文档<<Qt及Qt Quick开发实战精解.pdf& ...

  9. QML学习笔记-对QML基本认识

    首先是QML与Qt Quick的关系: 这就相当于C++与Qt的关系: 只是一个语言和框架的关系 从Qt 5.1开始,Qt Quick引入了一组界面控件,使用这些控件可以更简单地创建传统桌面应用.这些 ...

  10. qml 学习要点记录(2)

    Qt.binding()的作用,动态创建新的绑定,就是向Qt.binding()传递一个函数来返回需要的结果. import QtQuick 2.0 ​ Item {     width: 600   ...

最新文章

  1. 看麦田“蚂蚁网” 想网络新社区
  2. Android程序如何实现从网络中获取一张图片
  3. python接管已经打开ie浏览器_Python selenium:使用已经打开并使用登录凭据登录的浏览器...
  4. MSSQL 2008 企业管理器打开命令
  5. K8S Learning(10)——Pod配置
  6. java反射 动态调用_java反射拼接方法名动态执行方法
  7. 2022 智能语音技术最新进展与发展趋势
  8. c++实现gray code(格雷码)
  9. 孙鑫VC学习笔记:第十五讲 (一) 进程和线程基本概念
  10. 奇怪的技能又增加了,我学会了用ETS5配置KNX
  11. 32 位和 64 位版本的 Office 2010 之间的兼容性
  12. 分布式任务调度平台201902
  13. K/3 WISE新增自定核算项目
  14. 修改nginx站点根目录总结经验
  15. 利用Tsai-lenz算法实现手眼标定
  16. 【2020年高被引学者】 田奇 华为
  17. jquery获取单选框复选框下拉框值
  18. js逆向加密五邑大学教务系统密码AES实现模拟登录(仅供参考)
  19. 英语--副词描述变化量大小
  20. Java学习26--------冒泡排序

热门文章

  1. 微信怎么退出我的城市服务器,微信没有城市服务怎么办 微信城市服务在哪里...
  2. Xshell的使用;用Xshell修改服务器 Nginx配置文件-超详细(以修改上传文件大小上限为例)
  3. Visual Studio2019下载安装及问题解决
  4. 计算机组成组合逻辑电路,计算机组成原理组合逻辑电路.ppt
  5. STM32L0 串口uart通讯 USART1_IRQHandler
  6. IDR_MAINFRAME字符串资源含义
  7. 丑小鸭课件软件测试,《丑小鸭的故事》课件.ppt
  8. 跨桌面端之组件化实践
  9. 010机场等出租车排队时我该选择排哪队?
  10. JioNLP上的那些好用的冷门工具