中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

別墅裝修設(shè)計公司哪家好網(wǎng)站怎么優(yōu)化搜索

別墅裝修設(shè)計公司哪家好,網(wǎng)站怎么優(yōu)化搜索,上海工程建設(shè)信息網(wǎng)官網(wǎng),設(shè)計類哪個專業(yè)好QML旨在通過C 代碼輕松擴展。Qt QML模塊中的類使QML對象能夠從C 加載和操作,QML引擎與Qt元對象系統(tǒng)集成的本質(zhì)使得C 功能可以直接從QML調(diào)用。這允許開發(fā)混合應(yīng)用程序,這些應(yīng)用程序是通過混合使用QML,JavaScript和C 代碼實現(xiàn)的。除了從QML訪問…

? QML旨在通過C ++代碼輕松擴展。Qt QML模塊中的類使QML對象能夠從C ++加載和操作,QML引擎與Qt元對象系統(tǒng)集成的本質(zhì)使得C ++功能可以直接從QML調(diào)用。這允許開發(fā)混合應(yīng)用程序,這些應(yīng)用程序是通過混合使用QML,JavaScript和C ++代碼實現(xiàn)的。除了從QML訪問C ++功能的能力之外,Qt QML模塊還提供了從C ++代碼執(zhí)行反向和操作QML對象的方法。下面會通過示例來講解QML與C++的交互是如何實現(xiàn)的。

QML中創(chuàng)建C++對象

使用C ++代碼中定義的功能可以輕松擴展QML。由于QML引擎與Qt元對象系統(tǒng)的緊密集成,可以從QML代碼訪問由QObject派生的類適當(dāng)公開的任何功能。這使得C ++類的屬性和方法可以直接從QML訪問,通常很少或無需修改。

QML引擎能夠通過元對象系統(tǒng)內(nèi)省QObject實例。這意味著,任何QML代碼都可以訪問QObject派生類實例的以下成員:

  • 屬性(使用Q_PROPERTY注冊的屬性)
  • 方法(需注冊為public slots或是標記為Q_INVOKABLE)
  • 信號

(此外,如果已使用Q_ENUMS聲明枚舉,則可以使用枚舉。)

通常,無論是否已向QML類型系統(tǒng)注冊了QObject派生類,都可以從QML訪問它們。但是,如果QML引擎要訪問其他類型信息(例如,如果要將類本身用作方法參數(shù)或?qū)傩?#xff0c;或者要將其中一個枚舉類型用于以這種方式使用),那么該類可能需要注冊。代碼示例有四個文件,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函數(shù)可以在QML中訪問Q_INVOKABLE void sendSignal();//功能為發(fā)送信號//給類屬性添加訪問方法--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);//一個帶參數(shù)信號void nameChanged(const QString name);void yearChanged(int year);public slots://public槽函數(shù)可以在QML中訪問void cppSlotA();//一個無參槽函數(shù)void cppSlotB(const QString &str,int value);//一個帶參數(shù)槽函數(shù)private://類的屬性QString myName;int myYear;
};#endif // CPPOBJECT_H

在頭文件中,我定義了信號和public槽函數(shù),以及Q_INVOKABLE宏標記的public函數(shù),還通過Q_PROPERTY注冊了兩個屬性,這些方法和屬性之后都可以在QML中進行訪問。

#include "CppObject.h"#include <QDebug>CppObject::CppObject(QObject *parent): QObject(parent),myName("none"),myYear(0)
{}void CppObject::sendSignal()
{//測試用,調(diào)用該函數(shù)后發(fā)送信號qDebug()<<"CppObject::sendSignal";emit cppSignalA();emit cppSignalB(myName,myYear);
}void CppObject::setName(const QString &name)
{qDebug()<<"CppObject::setName"<<name;if(myName!=name){qDebug()<<"emit nameChanged";myName=name;emit nameChanged(name);}
}QString CppObject::getName() const
{qDebug()<<"CppObject::getName";return myName;
}void CppObject::setYear(int year)
{qDebug()<<"CppObject::setYear"<<year;if(year!=myYear){qDebug()<<"emit yearChanged";myYear=year;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::cppSlotB"<<str<<value;
}

為了測試方便,給每個函數(shù)都加了一個打印語句,當(dāng)調(diào)用sendSignal函數(shù)時將會emit兩個信號,稍后會在QML中調(diào)用該函數(shù)。

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "CppObject.h"int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//qmlRegisterType注冊C++類型至QML//arg1:import時模塊名//arg2:主版本號//arg3:次版本號//arg4:QML類型名qmlRegisterType<CppObject>("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調(diào)用Cpp對象:by 龔建波1992")color:"green"signal qmlSignalAsignal qmlSignalB(string str,int value)//鼠標點擊區(qū)域MouseArea{anchors.fill: parentacceptedButtons: Qt.LeftButton | Qt.RightButton//測試時點擊左鍵或右鍵onClicked: {if(mouse.button===Qt.LeftButton){console.log('----qml 點擊左鍵:Cpp發(fā)射信號')cpp_obj.name="gongjianbo"  //修改屬性會觸發(fā)set函數(shù),獲取值會觸發(fā)get函數(shù)cpp_obj.year=1992cpp_obj.sendSignal() //調(diào)用Q_INVOKABLE宏標記的函數(shù)}else{console.log('----qml 點擊右鍵:QML發(fā)射信號')root.qmlSignalA()root.qmlSignalB('gongjianbo',1992)}}}//作為一個QML對象CppObject{id:cpp_obj//也可以像原生QML對象一樣操作,增加屬性之類的property int counts: 0onYearChanged: {counts++console.log('qml onYearChanged',counts)}onCountsChanged: {console.log('qml onCountsChanged',counts)}}//組件加載完成執(zhí)行Component.onCompleted: {//關(guān)聯(lián)信號與信號處理函數(shù)的方式同QML中的類型//Cpp對象的信號關(guān)聯(lián)到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對象的信號關(guān)聯(lián)到Cpproot.onQmlSignalA.connect(cpp_obj.cppSlotA)root.onQmlSignalB.connect(cpp_obj.cppSlotB)}//定義的函數(shù)可以作為槽函數(shù)function processB(str,value){console.log('qml function processB',str,value)}
}

注冊之后就能直接在QML中使用剛才定義的C++類型了,并且可以像QML定義的類型一樣進行操作,如信號槽關(guān)聯(lián)、屬性綁定等。

這個示例很簡單,點擊鼠標左鍵調(diào)用CppObj的sendSignal函數(shù)來發(fā)送信號,QML處理;點擊鼠標右鍵QML發(fā)送信號,CppObj處理,下面是操作結(jié)果:

?可以看到QML成功的訪問了CppObj的屬性和方法,并能進行信號槽的關(guān)聯(lián)。

第二個例子:C++中加載QML對象

所有QML對象類型都是源自QObject類型,無論它們是由引擎內(nèi)部實現(xiàn)還是第三方定義。這意味著QML引擎可以使用Qt元對象系統(tǒng)動態(tài)實例化任何QML對象類型并檢查創(chuàng)建的對象。

這對于從C ++代碼創(chuàng)建QML對象非常有用,無論是顯示可以直觀呈現(xiàn)的QML對象,還是將非可視QML對象數(shù)據(jù)集成到C ++應(yīng)用程序中。一旦創(chuàng)建了QML對象,就可以從C ++中檢查它,以便讀取和寫入屬性,調(diào)用方法和接收信號通知。

可以使用QQmlComponentQQuickView來加載QML文檔。QQmlComponent將QML文檔作為為一個C++對象加載,然后可以從C++ 代碼進行修改。QQuickView也可以這樣做,但由于QQuickView是一個基于QWindow的派生類,加載的對象也將可視化顯示,QQuickView通常用于將一個可視化的QML對象集成到應(yīng)用程序的用戶界面中。

import QtQuick 2.9Item{id: rootwidth: 250height: 250//自定義屬性  --cpp可以訪問property string msg: "GongJianBo1992"//自定義信號  --可以觸發(fā)cpp槽函數(shù)signal qmlSendMsg(string arg1,string arg2)Rectangle {anchors.fill: parentcolor: "green"objectName: "rect" //用于cpp查找對象}MouseArea {anchors.fill: parentonClicked: {console.log("qml 點擊鼠標, 發(fā)送信號 qmlSendMsg")root.qmlSendMsg(root.msg,"myarg2")}}onHeightChanged: console.log("qml height changed")onWidthChanged: console.log("qml width changed")//QML中的方法可以被cpp調(diào)用,也可以作為槽函數(shù)function qml_method(val_arg){console.log("qml method runing",val_arg,"return ok")return "ok"}//注意槽函數(shù)參數(shù)為var類型function qmlRecvMsg(arg1,arg2){console.log("qml slot runing",arg1,arg2)}
}

在QML中定義了一些屬性和方法等,用于測試。

?

#ifndef CPPOBJECT_H
#define CPPOBJECT_H#include <QObject>
#include <QDebug>class CppObject : public QObject
{Q_OBJECT
public:explicit CppObject(QObject *parent = Q_NULLPTR):QObject(parent){}signals://信號 --用來觸發(fā)qml的函數(shù)//注意參數(shù)為var類型,對應(yīng)qml中js函數(shù)的參數(shù)類型void cppSendMsg(const QVariant &arg1,const QVariant &arg2);public slots://槽函數(shù) --用來接收qml的信號void cppRecvMsg(const QString &arg1,const QString &arg2){qDebug()<<"CppObject::cppRecvMsg"<<arg1<<arg2;qDebug()<<"emit cppSendMsg";emit cppSendMsg(arg1,arg2);}
};#endif // CPPOBJECT_H

Cpp中定義了一個槽函數(shù),用來接收QML對象的信號

#include <QGuiApplication>
#include <QQmlProperty>
#include <QQuickView>
#include <QQuickItem>
#include <QMetaObject>
#include <QDebug>#include "CppObject.h"int 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 *qmlObj=view.rootObject();/*文檔如是說:應(yīng)該始終使用QObject::setProperty()、QQmlProperty或QMetaProperty::write()來改變QML的屬性值,以確保QML引擎感知屬性的變化。*///【1】//通過QObject設(shè)置屬性值qDebug()<<"Cpp set qml property height";//qmlObj->setProperty("height",300);QQmlProperty(qmlObj,"height").write(300);//通過QObject獲取屬性值qDebug()<<"Cpp get qml property height"<<qmlObj->property("height");//任何屬性都可以通過C++訪問qDebug()<<"Cpp get qml property msg"<<qmlObj->property("msg");//【2】QQuickItem *item=qobject_cast<QQuickItem*>(qmlObj);//通過QQuickItem設(shè)置屬性值qDebug()<<"Cpp set qml property width";item->setWidth(300);//通過QQuickItem獲取屬性值qDebug()<<"Cpp get qml property width"<<item->width();//【3】//通過objectName訪問加載的QML對象//QObject::findChildren()可用于查找具有匹配objectName屬性的子項QObject *qmlRect=qmlObj->findChild<QObject*>("rect");if(qmlRect){qDebug()<<"Cpp get rect color"<<qmlRect->property("color");}//【4】//調(diào)用QML方法QVariant val_return;  //返回值QVariant val_arg="GongJianBo";  //參數(shù)值//Q_RETURN_ARG()和Q_Arg()參數(shù)必須制定為QVariant類型QMetaObject::invokeMethod(qmlObj,"qml_method",Q_RETURN_ARG(QVariant,val_return),Q_ARG(QVariant,val_arg));qDebug()<<"QMetaObject::invokeMethod result"<<val_return; //qml函數(shù)中返回“ok”//【5】//關(guān)聯(lián)信號槽CppObject cppObj;//關(guān)聯(lián)qml信號與cpp槽//如果信號參數(shù)為QML對象類型,信號用var參數(shù)類型,槽用QVariant類型接收QObject::connect(qmlObj,SIGNAL(qmlSendMsg(QString,QString)),&cppObj,SLOT(cppRecvMsg(QString,QString)));//關(guān)聯(lián)cpp信號與qml槽//qml中js函數(shù)參數(shù)為var類型,信號也用QVariant類型QObject::connect(&cppObj,SIGNAL(cppSendMsg(QVariant,QVariant)),qmlObj,SLOT(qmlRecvMsg(QVariant,QVariant)));//此外,cpp信號也可以關(guān)聯(lián)qml信號return app.exec();
}

然后就把文檔中的東西測試了下,操作起來很簡單。不過相對于QML中使用C++對象來說,感覺作用沒那么大,因為一般把QML嵌入到Widgets中才會做這些操作,但是混合兩個框架很多坑。下面是測試輸出結(jié)果:

http://m.risenshineclean.com/news/58930.html

相關(guān)文章:

  • 上海做網(wǎng)站建設(shè)的公司免費建站哪個網(wǎng)站最好
  • 中國建設(shè)局網(wǎng)站招聘怎么做線上推廣
  • 網(wǎng)站的素材做logoseo推廣一年要多少錢
  • wordpress 客戶端源碼分析甘肅搜索引擎網(wǎng)絡(luò)優(yōu)化
  • 個人網(wǎng)站可以做推廣嗎網(wǎng)站建設(shè)網(wǎng)絡(luò)公司
  • 網(wǎng)站建設(shè)管理關(guān)于友誼的連接
  • 網(wǎng)站怎么才能吸引人seo優(yōu)化步驟
  • 普通電腦可以做網(wǎng)站服務(wù)器韓國最新新聞
  • 施甸網(wǎng)站建設(shè)小紅書kol推廣
  • 上海 專業(yè)網(wǎng)站建設(shè)seo關(guān)鍵詞選取工具
  • 買了域名和空間怎么做網(wǎng)站新鄭網(wǎng)絡(luò)推廣
  • 廣東雙語網(wǎng)站建設(shè)價格百度關(guān)鍵詞優(yōu)化方法
  • cms仿站教程新媒體運營崗位職責(zé)
  • 用python做一旅游網(wǎng)站百度平臺電話多少
  • 河津做網(wǎng)站淘寶推廣哪種方式最好
  • 建筑培訓(xùn)中心上海aso優(yōu)化公司
  • 建立個人征信系統(tǒng)的目的是seo如何優(yōu)化網(wǎng)站推廣
  • 網(wǎng)站商城建設(shè)實訓(xùn)心得企業(yè)培訓(xùn)機構(gòu)
  • 市體育局網(wǎng)站 兩學(xué)一做搜索引擎排名優(yōu)化公司
  • 免費營銷管理系統(tǒng)crm吉林網(wǎng)站seo
  • 做商城網(wǎng)站用什么框架常用的seo查詢工具
  • 網(wǎng)站后臺模板免費下載搜索引擎都有哪些
  • 土特產(chǎn)網(wǎng)站平臺建設(shè)南昌seo管理
  • 服務(wù)器架設(shè)國外做違法網(wǎng)站深圳百度seo公司
  • 網(wǎng)站系統(tǒng)升級維護需要多長時間百度端口開戶推廣
  • 網(wǎng)站排名靠前方法網(wǎng)絡(luò)營銷推廣的要點
  • 中國大搞建設(shè)hyein seo官網(wǎng)
  • 素材之家思億歐seo靠譜嗎
  • 排名做網(wǎng)站優(yōu)化免費自助建站平臺
  • 名表網(wǎng)站企業(yè)培訓(xùn)心得體會