当前位置: 首页 > news >正文

北京网站建设培训学校怀化租房网站

北京网站建设培训学校,怀化租房网站,商城类网站建设 数据库,网站建设心得小结QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作#xff0c;QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序#xff0c;这些应用程序是通过混合使用QML#xff0c;JavaScript和C 代码实现的。除了从QML访问…  QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序这些应用程序是通过混合使用QMLJavaScript和C 代码实现的。除了从QML访问C 功能的能力之外Qt QML模块还提供了从C 代码执行反向和操作QML对象的方法。下面会通过示例来讲解QML与C的交互是如何实现的。 QML中创建C对象 使用C 代码中定义的功能可以轻松扩展QML。由于QML引擎与Qt元对象系统的紧密集成可以从QML代码访问由QObject派生的类适当公开的任何功能。这使得C 类的属性和方法可以直接从QML访问通常很少或无需修改。 QML引擎能够通过元对象系统内省QObject实例。这意味着任何QML代码都可以访问QObject派生类实例的以下成员 属性使用Q_PROPERTY注册的属性方法需注册为public slots或是标记为Q_INVOKABLE信号 此外如果已使用Q_ENUMS声明枚举则可以使用枚举。 通常无论是否已向QML类型系统注册了QObject派生类都可以从QML访问它们。但是如果QML引擎要访问其他类型信息例如如果要将类本身用作方法参数或属性或者要将其中一个枚举类型用于以这种方式使用那么该类可能需要注册。代码示例有四个文件QtQuick Empty工程的两个加自定义的Cpp类h和cpp文件。 #ifndef CPPOBJECT_H #define CPPOBJECT_H#include QObject//派生自QObject //使用qmlRegisterType注册到QML中 class CppObject : public QObject {Q_OBJECT//注册属性使之可以在QML中访问--具体语法百度Q_PROPERTYQ_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)Q_PROPERTY(int year READ getYear WRITE setYear NOTIFY yearChanged)public:explicit CppObject(QObject *parent nullptr);//通过Q_INVOKABLE宏标记的public函数可以在QML中访问Q_INVOKABLE void sendSignal();//功能为发送信号//给类属性添加访问方法--myNamevoid setName(const QString name);QString getName() const;//给类属性添加访问方法--myYearvoid setYear(int year);int getYear() const;signals://信号可以在QML中访问void cppSignalA();//一个无参信号void cppSignalB(const QString str,int value);//一个带参数信号void nameChanged(const QString name);void yearChanged(int year);public slots://public槽函数可以在QML中访问void cppSlotA();//一个无参槽函数void cppSlotB(const QString str,int value);//一个带参数槽函数private://类的属性QString myName;int myYear; };#endif // CPPOBJECT_H 在头文件中我定义了信号和public槽函数以及Q_INVOKABLE宏标记的public函数还通过Q_PROPERTY注册了两个属性这些方法和属性之后都可以在QML中进行访问。 #include CppObject.h#include QDebugCppObject::CppObject(QObject *parent): QObject(parent),myName(none),myYear(0) {}void CppObject::sendSignal() {//测试用调用该函数后发送信号qDebug()CppObject::sendSignal;emit cppSignalA();emit cppSignalB(myName,myYear); }void CppObject::setName(const QString name) {qDebug()CppObject::setNamename;if(myName!name){qDebug()emit nameChanged;myNamename;emit nameChanged(name);} }QString CppObject::getName() const {qDebug()CppObject::getName;return myName; }void CppObject::setYear(int year) {qDebug()CppObject::setYearyear;if(year!myYear){qDebug()emit yearChanged;myYearyear;emit yearChanged(myYear);} }int CppObject::getYear() const {qDebug()CppObject::getYear;return myYear; }void CppObject::cppSlotA() {qDebug()CppObject::cppSlotA; }void CppObject::cppSlotB(const QString str, int value) {qDebug()CppObject::cppSlotBstrvalue; } 为了测试方便给每个函数都加了一个打印语句当调用sendSignal函数时将会emit两个信号稍后会在QML中调用该函数。 #include QGuiApplication #include QQmlApplicationEngine #include QQmlContext #include CppObject.hint main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//qmlRegisterType注册C类型至QML//arg1:import时模块名//arg2:主版本号//arg3:次版本号//arg4:QML类型名qmlRegisterTypeCppObject(MyCppObject,1,0,CppObject);QQmlApplicationEngine engine;//也可以注册为qml全局对象//engine.rootContext()-setContextProperty(cppObj,new CppObject(qApp));engine.load(QUrl(QStringLiteral(qrc:/main.qml)));if (engine.rootObjects().isEmpty())return -1;return app.exec(); } 通过使用qmlRegisterType将刚才定义的QObject派生类注册到QML中。 import QtQuick 2.9 import QtQuick.Window 2.9 //引入我们注册的模块 import MyCppObject 1.0Window {id: rootvisible: truewidth: 500height: 300title: qsTr(QML调用Cpp对象by 龚建波1992)color:greensignal qmlSignalAsignal qmlSignalB(string str,int value)//鼠标点击区域MouseArea{anchors.fill: parentacceptedButtons: Qt.LeftButton | Qt.RightButton//测试时点击左键或右键onClicked: {if(mouse.buttonQt.LeftButton){console.log(----qml 点击左键Cpp发射信号)cpp_obj.namegongjianbo //修改属性会触发set函数获取值会触发get函数cpp_obj.year1992cpp_obj.sendSignal() //调用Q_INVOKABLE宏标记的函数}else{console.log(----qml 点击右键QML发射信号)root.qmlSignalA()root.qmlSignalB(gongjianbo,1992)}}}//作为一个QML对象CppObject{id:cpp_obj//也可以像原生QML对象一样操作增加属性之类的property int counts: 0onYearChanged: {countsconsole.log(qml onYearChanged,counts)}onCountsChanged: {console.log(qml onCountsChanged,counts)}}//组件加载完成执行Component.onCompleted: {//关联信号与信号处理函数的方式同QML中的类型//Cpp对象的信号关联到Qml//cpp_obj.onCppSignalA.connect(function(){console.log(qml signalA process)})cpp_obj.onCppSignalA.connect(()console.log(qml signalA process)) //js的lambdacpp_obj.onCppSignalB.connect(processB)//Qml对象的信号关联到Cpproot.onQmlSignalA.connect(cpp_obj.cppSlotA)root.onQmlSignalB.connect(cpp_obj.cppSlotB)}//定义的函数可以作为槽函数function processB(str,value){console.log(qml function processB,str,value)} } 注册之后就能直接在QML中使用刚才定义的C类型了并且可以像QML定义的类型一样进行操作如信号槽关联、属性绑定等。 这个示例很简单点击鼠标左键调用CppObj的sendSignal函数来发送信号QML处理点击鼠标右键QML发送信号CppObj处理下面是操作结果 可以看到QML成功的访问了CppObj的属性和方法并能进行信号槽的关联。 第二个例子C中加载QML对象 所有QML对象类型都是源自QObject类型无论它们是由引擎内部实现还是第三方定义。这意味着QML引擎可以使用Qt元对象系统动态实例化任何QML对象类型并检查创建的对象。 这对于从C 代码创建QML对象非常有用无论是显示可以直观呈现的QML对象还是将非可视QML对象数据集成到C 应用程序中。一旦创建了QML对象就可以从C 中检查它以便读取和写入属性调用方法和接收信号通知。 可以使用QQmlComponent或QQuickView来加载QML文档。QQmlComponent将QML文档作为为一个C对象加载然后可以从C 代码进行修改。QQuickView也可以这样做但由于QQuickView是一个基于QWindow的派生类加载的对象也将可视化显示QQuickView通常用于将一个可视化的QML对象集成到应用程序的用户界面中。 import QtQuick 2.9Item{id: rootwidth: 250height: 250//自定义属性 --cpp可以访问property string msg: GongJianBo1992//自定义信号 --可以触发cpp槽函数signal qmlSendMsg(string arg1,string arg2)Rectangle {anchors.fill: parentcolor: greenobjectName: rect //用于cpp查找对象}MouseArea {anchors.fill: parentonClicked: {console.log(qml 点击鼠标, 发送信号 qmlSendMsg)root.qmlSendMsg(root.msg,myarg2)}}onHeightChanged: console.log(qml height changed)onWidthChanged: console.log(qml width changed)//QML中的方法可以被cpp调用也可以作为槽函数function qml_method(val_arg){console.log(qml method runing,val_arg,return ok)return ok}//注意槽函数参数为var类型function qmlRecvMsg(arg1,arg2){console.log(qml slot runing,arg1,arg2)} } 在QML中定义了一些属性和方法等用于测试。 #ifndef CPPOBJECT_H #define CPPOBJECT_H#include QObject #include QDebugclass CppObject : public QObject {Q_OBJECT public:explicit CppObject(QObject *parent Q_NULLPTR):QObject(parent){}signals://信号 --用来触发qml的函数//注意参数为var类型对应qml中js函数的参数类型void cppSendMsg(const QVariant arg1,const QVariant arg2);public slots://槽函数 --用来接收qml的信号void cppRecvMsg(const QString arg1,const QString arg2){qDebug()CppObject::cppRecvMsgarg1arg2;qDebug()emit cppSendMsg;emit cppSendMsg(arg1,arg2);} };#endif // CPPOBJECT_H Cpp中定义了一个槽函数用来接收QML对象的信号 #include QGuiApplication #include QQmlProperty #include QQuickView #include QQuickItem #include QMetaObject #include QDebug#include CppObject.hint main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//可以用QQmlComponent\QQuickView\QQuickWidget的C代码加载QML文档//QQuickView不能用Window做根元素QQuickView view(QUrl(qrc:/main.qml));view.show();//获取到qml根对象的指针QObject *qmlObjview.rootObject();/*文档如是说应该始终使用QObject::setProperty()、QQmlProperty或QMetaProperty::write()来改变QML的属性值以确保QML引擎感知属性的变化。*///【1】//通过QObject设置属性值qDebug()Cpp set qml property height;//qmlObj-setProperty(height,300);QQmlProperty(qmlObj,height).write(300);//通过QObject获取属性值qDebug()Cpp get qml property heightqmlObj-property(height);//任何属性都可以通过C访问qDebug()Cpp get qml property msgqmlObj-property(msg);//【2】QQuickItem *itemqobject_castQQuickItem*(qmlObj);//通过QQuickItem设置属性值qDebug()Cpp set qml property width;item-setWidth(300);//通过QQuickItem获取属性值qDebug()Cpp get qml property widthitem-width();//【3】//通过objectName访问加载的QML对象//QObject::findChildren()可用于查找具有匹配objectName属性的子项QObject *qmlRectqmlObj-findChildQObject*(rect);if(qmlRect){qDebug()Cpp get rect colorqmlRect-property(color);}//【4】//调用QML方法QVariant val_return; //返回值QVariant val_argGongJianBo; //参数值//Q_RETURN_ARG()和Q_Arg()参数必须制定为QVariant类型QMetaObject::invokeMethod(qmlObj,qml_method,Q_RETURN_ARG(QVariant,val_return),Q_ARG(QVariant,val_arg));qDebug()QMetaObject::invokeMethod resultval_return; //qml函数中返回“ok”//【5】//关联信号槽CppObject cppObj;//关联qml信号与cpp槽//如果信号参数为QML对象类型信号用var参数类型槽用QVariant类型接收QObject::connect(qmlObj,SIGNAL(qmlSendMsg(QString,QString)),cppObj,SLOT(cppRecvMsg(QString,QString)));//关联cpp信号与qml槽//qml中js函数参数为var类型信号也用QVariant类型QObject::connect(cppObj,SIGNAL(cppSendMsg(QVariant,QVariant)),qmlObj,SLOT(qmlRecvMsg(QVariant,QVariant)));//此外cpp信号也可以关联qml信号return app.exec(); } 然后就把文档中的东西测试了下操作起来很简单。不过相对于QML中使用C对象来说感觉作用没那么大因为一般把QML嵌入到Widgets中才会做这些操作但是混合两个框架很多坑。下面是测试输出结果
http://www.ho-use.cn/article/10818449.html

相关文章:

  • 做公司网站需要注意哪些软件商店打不开怎么办
  • 美团是最早做团购的网站么企业网站的建设流程
  • 天津网站建设揭秘手机网站对企业用户的好处
  • dedecmsv5.6 qq空间网站模板wordpress版本列表
  • 有哪些基于网站开发的报表设计器建立大型网站吗
  • 学网站建设培训班怎么制作自己的水印
  • 公司内部网站建设方案织梦网站描述
  • 万网没备案怎么做网站保险设计素材网站
  • 图书网站开发介绍seo技术交流论坛
  • 做净化行业需要知道的网站wordpress免费采集器
  • 刚做的网站怎么搜索不出来的用什么网站可以做电子书
  • 一个网站的建设需要什么东西泰安房价走势图
  • 在线观看视频的免费网站网站备案的意思
  • 网站快照时间网站被黑 原因
  • 网站建设公众号开加快政务网站建设
  • 网站视频怎么做的好处专业网站开发费用
  • 没有网站百度推广四川建设厅报名网站
  • 怀远县建设局门户网站php搭建网站软件下载
  • 网站首页布局设计用什么搭建平台网站有什么用
  • 嘉兴公司制作网站的淘宝网络营销案例分析
  • 自学网站开发需要看什么书建设电瓶车官方网站
  • 网站建设与维护书籍推荐系统管理的主要内容
  • 百度网站v2升级到v3怎么做游戏源码网站免费
  • 网站关键词seo优化公司改进网站的建议
  • 怎么做免费网站百度手机助手安卓版下载
  • 有多少做汽车的网站制作人韩剧结局
  • 上海建设银行网站转账记录微信开发者平台怎么登
  • 网站建设外包工作vi设计与网站建设招标文件
  • 什么是可信网站做网站一班需要多少钱
  • 临沂市住房和城乡建设局网站跨境网络营销是什么