最近在做诺基亚一个项目
需要用qml请求网络数据 之前的方案是用c++获取 后来发现那是一种非常糟糕的方法,后来查看诺基亚论坛里面 提供了一种方法 如下
如何用QML获取XML标签的属性
引言
QML script 支持 XMLHttpRequest 对象,我们可以使用它从网络上异步地获取数据。Qt文档中对XMLHttpRequest 的介绍很少,其自带的 XMLHttpRequest 例子也只是介绍了其一部分用法,并没有介绍如何获取XML标签的属性。本文就为大家简要介绍一下这方面的知识。
主要代码分析
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
log.text = ""
console.log("\n")
var doc = new XMLHttpRequest();
doc.onreadystatechange = function() {
if (doc.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
//showRequestInfo("Headers -->");
//showRequestInfo(doc.getAllResponseHeaders ());
//showRequestInfo("Last modified -->");
//showRequestInfo(doc.getResponseHeader ("Last-Modified"));
} else if (doc.readyState == XMLHttpRequest.DONE) {
var a = doc.responseXML.documentElement;
for (var ii = 0; ii < a.childNodes.length; ++ii) {
showRequestInfo("a.childNodes[" + ii + "].nodeName:" + a.childNodes[ii].nodeName);
var attr = a.childNodes[ii].attributes;
if(attr!=null) {
//following codes show how to get xml attributes
for (var j = 0; j < attr.length; ++j) {
showRequestInfo('attr[' + j + '].name=' + attr[j].name + ', attr[' + j + '].value=' + attr[j].value);
}
}
}
//showRequestInfo("Headers -->");
//showRequestInfo(doc.getAllResponseHeaders ());
//showRequestInfo("Last modified -->");
//showRequestInfo(doc.getResponseHeader ("Last-Modified"));
}
}
doc.open("GET", "data.xml");
//doc.open("GET", "http://api.flickr.com/services/feeds/photos_public.gne?format=rss2&tags=cat");
//doc.open("GET", "http://rss.sina.com.cn/edu/focus19.xml");
doc.send();
}
}
当区域被点击之后,我们首先创建了一个XMLHttpRequest,然后请求xml数据。当完全获取数据之后,我们首先取得responseXML的根节点。而后进行遍历。
a.childNodes[ii].attributes里并没有存放属性,具体属性的获取要通过 attr[j].value 。
参考:qdeclarativeglobalobject
还需要说明的一点是,为了使我们的qml程序能稳定地访问网络,那么们就需要为我们的qml程序设置一个NetworkAccessManager,这需要使用QDeclarativeEngine::setNetworkAccessManagerFactory()。当然我们也可以简单的使用系统默认设置:QNetworkProxyFactory::setUseSystemConfiguration(true); 详情见附件代码。
这里我们为了说明问题,采用了一个简单的静态本地xml文件——data.xml 。当然实际应用中我们通常会去网上动态地获取xml数据,见以上代码中注释掉的doc.open两行。
data.xml的内容如下:
<?xml version="1.0"?>
<note>
<to id="recipients" address="name@company.com">Jones</to>
<from>Jani</from>
</note>
程序输出分析
下面是程序的控制台输出:
a.childNodes[0].nodeName:#text
a.childNodes[1].nodeName:to
attr[0].name=id, attr[0].value=recipients
attr[1].name=address, attr[1].value=name@company.com
a.childNodes[2].nodeName:#text
a.childNodes[3].nodeName:from
a.childNodes[4].nodeName:#text
从以上输出明显可以看出XML文档的树形结构。 data.xml的根节点含有5个Node,其中Node1,和Node3分别对应data.xml中的 to 和 from标签。其中to 标签中含有两个属性,把它们都输出出来了。
这里补充说明一点:Node1又包含一个text的节点,其内容就是“Jones”。
下载例程
Media:QMLXmlHttpProperty.zip
Media:Simple微博客户端.zip
分享到:
相关推荐
c++数据传入qml, qml数据返回给c++,数据互传 ,两种方式
Qt6 QML Book/网络设置/HTTP请求 示例源码 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者交流使用,请于下载24小时内删除
现在做开发越来越多地...qml作为ui界面的写法是有原因的,qml从设计开始就时着重与ui的快速开发,所以在逻辑控制上会弱很多,特别是在网络通讯上面就必须要qt这边实现了。这篇经验时介绍如何使用Qt与qml的数据交互。
类中,采用Qt下QNetworkAccessManager,QNetworkRequest,QnetworkReply三大原生API对qml传递过来的json数据进行转换并转发给服务器完成Get,POST以及图片上传加载的网络请求功能。其中转换包含QJsonObject,QString,与...
自定义QML中的TableView的数据表现样式,主要是对表格中每列的数据定义不同的表现形式,例如用单选框、ComBobox、进度条等形式对数据进行形象化的显示,对于熟悉TableView的使用有较大的帮助 ,本代码可以直接通过...
Qt 提供了两种在 QML 环境中使用 C++ 对象的方式: 1. 在 C++ 中实现一个类,注册到 QML 环境中, QML 环境中使用该类型创建对象 2. 在 C++ 中构造一个对象,将这个对象设置为 QML 的上下文属性,在 QML 环境中直接...
Qt qml ChartView demo 动态数据曲线图显示
qml的tableview数据导出到excel
qml中的TreeView是QtQuick.Controls 1.x的一个组件,由于现在Qt发展QtQtQuick.Controls 2.x,1.x不再更新新特性,这方面的资料也比较少,如果想在其Delegate中传递更多的数据,则需要对styleData.value进行定制,...
数据结构课程设计,地铁公交换乘系统(demo),使用Qt QML.zip 数据结构课程设计,地铁公交换乘系统(demo),使用Qt QML.zip 数据结构课程设计,地铁公交换乘系统(demo),使用Qt QML.zip 数据结构课程设计,地铁公交换乘系统...
1 qml 实现Json数据可视化。
qml + opencv
qt qml c++ 折线图
qml中TreeView自定义数据类型,使在代理(Delegate)中能传递到更多的数据 具体可以访问博客https://www.jianshu.com/p/dc24d010e5e4
QT 在使用widiget做界面时,有时会添加qml界面,这个资源就是在widiget中加入qml界面,并且实现了widiget与qml的双向数据交互
主要涉及在qml中ListView显示,使用了ListModel、ObjectModel、QStringList、QList*>、QAbstractListModel作为数据模型,其中使用ObjectModel能省去delegate.
c++与qml的交互数据传递及其实时刷新
Qt6 QML Book/网络设置/使用OAuth进行身份验证 示例源码 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者交流使用,请于下载24小时内删除
qml mvc 使用checkbox全选、反选。TableViewColumn中添加代理checkbox在qml直接赋值会导致点击checkbox状态无法更新,本demo正好解决这个问题