QT学习之QScript
QT中有解析Json的一个类叫QScript。貌似还有一个QJson,但听说解析的方便性不如QScript,具体没有深入探究,这里仅简单记录一下QScript的使用。
首先,主要使用到的类有QScriptEngine和QScriptValue,这里写了一个Demo,是用来将一个存有Json语句的QString解析后存入XML里并在Debug里显示出来。由于理论知识装备的并不充足,所以就先实战一下吧。写入XML方法使用的是QXmlStreamWriter类。
首先,建议使用窗口,即使是空窗口。因为这样当你关闭窗口的时候程序就会自动结束。那使用如下代码呢?
|
1
2
3
4
5
6
|
int main(int argc, char *argv[]){ dbg<<"This is a Test !"; QScriptJson qsj("D:\\json.xml");//QScriptJson是接下来自己定义的类 qsj.write2File(); return 0;} |
NO !会出现下面的错误信息:
QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine
意思就是要使用QScriptEngine,必须要先构造一个Q(Core)Application,所以老老实实构造一个吧。
下面是我的程序代码:
【AHeaders.h】加上了要使用的头文件
|
1
2
3
4
5
6
7
8
9
10
11
|
#ifndef AHEADERS_H#define AHEADERS_H#include <QDebug>#include <QVariant>#include <QString>#include <QStringList>#include <QXmlStreamWriter>#define dbg qDebug()#endif // AHEADERS_H |
【qscriptjson.h】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#ifndef QSCRIPTJSON_H#define QSCRIPTJSON_H#include <QScriptEngine>#include <QScriptValue>#include <QScriptValueIterator>#include <QFile>#include <QMap>#include "AHeaders.h"class QScriptJson{public: QScriptJson(const QString &fileName); ~QScriptJson(); bool write2File();private: void getPropety(QScriptValue sv, QStringList sLsPty);//输出到XML void getPropety(QScriptValue sv, QStringList sLsPty,QString space);//输出到Debugprivate: QXmlStreamWriter m_writer; QString m_fileName; QMap<QString,QVariant> m_mapProperty; //存放数据层次属性 QMap<QString,QVariant> m_mapItems; //节点中的子节点集};#endif // QSCRIPTJSON_H |
【qscriptjson.cpp】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#include "qscriptjson.h"//要处理的数据
static QString datas = QString("{'billcount':2,'bills':[\ {'billID':'010101001','billname':'平整场地','billunit':'m2','decount':3,\ 'des':[{'deID':'A1-1','decont':'建筑场地挖填高度在±30cm以内的找平','dename':'平整场地','deunit':'100m2'},\ {'deID':'A1-3','decont':'土方开挖','dename':'人工挖土方 三类土 深度在1.5m内','deunit':'100m3'},\ {'deID':'A1-4','decont':'土方开挖','dename':'人工挖土方 四类土 深度在1.5m内','deunit':'100m3'}]},\ {'billID':'010101005','billname':'挖淤泥、流砂','billunit':'m3','decount':1,\ 'des':[{'deID':'A1-27','decont':'挖淤泥、流砂','dename':'人工挖淤泥流砂','deunit':'100m3'}]}]}");QScriptJson::QScriptJson(const QString &fileName){ m_fileName=fileName; QStringList sls; m_mapProperty.insert("_BEGIN_","BillTable"); sls<<"billcount"<<"bills"; m_mapProperty.insert("BillTable",sls); sls.clear(); sls<<"billID"<<"billname"<<"billunit"<<"decount"<<"des"; m_mapProperty.insert("bills",sls); sls.clear(); sls<<"deID"<<"decont"<<"dename"<<"deunit"; m_mapProperty.insert("des",sls); sls.clear(); m_mapProperty.insert("_END_","_END_"); m_mapItems.insert("bills","BillItem"); m_mapItems.insert("des","DesItem");}QScriptJson::~QScriptJson(){}bool QScriptJson::write2File(){ QString dt=datas; QFile file(m_fileName); if (!file.open(QFile::WriteOnly | QFile::Text)) { dbg<<QString("打不开文件 : %1").arg (m_fileName); return false; } try{ m_writer.setDevice(&file); m_writer.setAutoFormatting(true); //文档开始 m_writer.writeStartDocument(); QScriptEngine engine; QScriptValue sv = engine.evaluate("value="+dt); QString strBegin=m_mapProperty.value("_BEGIN_").toString(); m_writer.writeStartElement(strBegin); QStringList sLsPty=m_mapProperty.value(strBegin).toStringList(); getPropety(sv,sLsPty," "); getPropety(sv,sLsPty); m_writer.writeEndElement(); m_writer.writeEndDocument(); }catch(...){ dbg<<"Error: Write to File ."; file.close(); } file.close();}void QScriptJson::getPropety(QScriptValue sv,QStringList sLsPty){ foreach(QString element,sLsPty){ QScriptValue sptV=sv.property(element); if(!sptV.isArray()){ QString value=sptV.toString(); m_writer.writeAttribute(element,value); }else{ m_writer.writeStartElement(element); QScriptValueIterator it(sptV); while (it.hasNext()) { it.next(); if(it.flags()&&QScriptValue::SkipInEnumeration)continue; QString item=m_mapItems.value(element).toString(); m_writer.writeStartElement(item); QStringList sLs_Child=m_mapProperty.value(element).toStringList(); getPropety(it.value(),sLs_Child); m_writer.writeEndElement(); } m_writer.writeEndElement(); } }}void QScriptJson::getPropety(QScriptValue sv, QStringList sLsPty,QString space){ foreach(QString str,sLsPty){ QScriptValue sptV=sv.property(str); if(!sptV.isArray()){ QString str2=sptV.toString(); dbg<<(space+str+QString(" : ")+str2); //如果当前属性不是一个数组,则输出其内容 }else{ dbg<<(space+str+QString(" [ ")); QScriptValueIterator it(sptV);// dbg<<it.name()<<it.value().toString();// if(it.hasNext())it.next(); while (it.hasNext()) { it.next();// dbg<<it.name()<<it.value().toString(); if(it.flags()&&QScriptValue::SkipInEnumeration)continue; QStringList sLs_Child=m_mapProperty.value(str).toStringList(); getPropety(it.value(),sLs_Child,space+" ");// it.next(); }// dbg<<it.name()<<it.value().toString(); dbg<<(space+str+QString(" ] ")); } }} |
至此,主要文件结束,下面是一个窗口文件:
【mainwindow.h】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTextEdit>class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QString strText, QWidget *parent = 0); ~MainWindow(); void setText(QString strText);private: QTextEdit *m_te; QString m_text;};#endif // MAINWINDOW_H |
【mainwindow.cpp】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include "mainwindow.h"MainWindow::MainWindow(QString strText,QWidget *parent) : QMainWindow(parent){ m_text=strText; m_te=new QTextEdit(this); m_te->setText(m_text); this->setCentralWidget(m_te);}MainWindow::~MainWindow(){ delete m_te;}void MainWindow::setText(QString strText){ m_text=m_text+"\n"+strText; m_te->setText(m_text);} |
最后上Main函数!
【main.cpp】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include "mainwindow.h"#include <QApplication>#include "qscriptjson.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w("程序开始。。。"); w.show(); dbg<<"This is a Test !"; QScriptJson qsj("D:\\json.xml"); qsj.write2File(); w.setText("程序已运行完成!\n\n关闭窗口退出程序。。。"); return a.exec();} |
运行后生成的XML文档“json.xml”如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?xml version="1.0" encoding="UTF-8"?><BillTable billcount="2"> <bills> <BillItem billID="010101001" billname="平整场地" billunit="m2" decount="3"> <des> <DesItem deID="A1-1" decont="建筑场地挖填高度在±30cm以内的找平" dename="平整场地" deunit="100m2"/> <DesItem deID="A1-3" decont="土方开挖" dename="人工挖土方 三类土 深度在1.5m内" deunit="100m3"/> <DesItem deID="A1-4" decont="土方开挖" dename="人工挖土方 四类土 深度在1.5m内" deunit="100m3"/> </des> </BillItem> <BillItem billID="010101005" billname="挖淤泥、流砂" billunit="m3" decount="1"> <des> <DesItem deID="A1-27" decont="挖淤泥、流砂" dename="人工挖淤泥流砂" deunit="100m3"/> </des> </BillItem> </bills></BillTable> |
Debug输出如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
This is a Test !" billcount : 2"" bills [ "" billID : 010101001"" billname : 平整场地"" billunit : m2"" decount : 3"" des [ "" deID : A1-1"" decont : 建筑场地挖填高度在±30cm以内的找平"" dename : 平整场地"" deunit : 100m2"" deID : A1-3"" decont : 土方开挖"" dename : 人工挖土方 三类土 深度在1.5m内"" deunit : 100m3"" deID : A1-4"" decont : 土方开挖"" dename : 人工挖土方 四类土 深度在1.5m内"" deunit : 100m3"" des ] "" billID : 010101005"" billname : 挖淤泥、流砂"" billunit : m3"" decount : 1"" des [ "" deID : A1-27"" decont : 挖淤泥、流砂"" dename : 人工挖淤泥流砂"" deunit : 100m3"" des ] "" bills ] " |
接下来要研读研读理论方面的内容了。博文中有错误之处,欢迎指正!
声明:本博文为博主原创,转载请注明来源,谢谢合作!
QT学习之QScript的更多相关文章
- QT学习第1天
QT学习第一天 坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) ...
- 【转载】分享一些Qt学习资源,欢迎下载
资源来源:http://bbs.csdn.net/topics/390358737 经过我一翻整理,把一些我收集到的Qt学习资源分享给大家,主要适合新手,老鸟可以直接忽略我.要说明一下,很多资源都是在 ...
- QT学习之路--创建一个对话框
Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学 ...
- 转载: Qt 学习之路 2归档
Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/
- Qt 学习资料
Qter开源社区http://www.qter.org/ [Qt教程], 作者yafeilinux [视频] QT学习之路:从入门到精通 <C++ Qt 编程视频教程>
- qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果
应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏 ...
- Qt学习博客推荐
附录C Qt资源 C.1 Qt 官方资源 全 球各大公司以及独立开发人员每天都在加入 Qt 的开发社区.他们已经认识到了Qt 的架构本身便可加快应用程序开发进度.这些开发人员,无论是想开发单平台软件. ...
- qt学习教程1.qt开发环境搭建
qt学习教程1.qt开发环境搭建 首先下载qt 下载地址:http://download.qt.io/archive/qt/ 此教程使用的版本为5.1.1 下载好后,打开安装包,然后点下一步 选择一个 ...
- QT学习教程
原地址:http://www.devbean.NET/2012/08/qt-study-road-2-catelog/ 网上看到的不错的教程 本教程以qt5为主,部分地方会涉及qt4.据说非常适合qt ...
随机推荐
- 函数之-------------------------HR管理操作
import os import time def emplog(content): #记录操作的一个函数,在删除,添加,修改都会用到这一操作, f=open("emp.log", ...
- java——删除链表中等于给定值的所有元素
class ListNode{ int val ; ListNode next; public ListNode(int x) { val = x; } public ListNode(int[] a ...
- my.赚钱
http://mhxy.gamedog.cn/201503/999433.html (发表于 2015-03-19) 梦幻西游手游四种赚钱技巧翻身做土豪教程,在游戏中玩家需要知道的就是赚钱方法是非 ...
- getElementsByTagName 、 getElementsByName 、getElementById区别
WEB标准下可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问DOCUMENT中的任一个标签: getEle ...
- Oracle 配置监听和本地网络服务
一.配置监听 在oracle的配置和移植工具中打开Net Configuration Assistant,然后点击下一步. 点击下一步,然后输入监听的名称点击下一步 点击下一步后如图 点击下一步如图 ...
- Mybatis学习笔记9 - 鉴别器discriminator
鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装行为. 示例如下: DeptmentMapper接口定义: package com.mybatis.dao ...
- 使用codesmith无法连接mysql问题
最近研究codesmith的用法,遇到了如题的问题,记录一下解决的方法. 1.问题描述: 在codesmith中选择MySQLSchemaProvider并连接数据库时,会报以下错误: Test fa ...
- [转]HTML字符实体(Character Entities),转义字符串(Escape Sequence)
为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...
- ubuntu mongodb报错:mongo - couldn't connect to server 127.0.0.1:27017
在进入mongo的时候,出现在下面错误信息.那如何解决呢? 标记一下,以便下次理碰的到时候,有个参考. warning: Failed to connect to 127.0.0.1:27017, r ...
- JavaScript Date学习实例:获取3分钟前的时间“hhmmss”格式
上一篇博客分享了Date对象的理论知识,今天正好看到一段相关的代码,可以继续深化,通过实例加强复习Date 题目:获取3分钟前的时间,并且显示格式是hhmmss 以下是看到的代码 var time=n ...