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);//输出到Debug
private :
    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_OBJECT
public :
     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 ] "

接下来要研读研读理论方面的内容了。博文中有错误之处,欢迎指正!

声明:本博文为博主原创,转载请注明来源,谢谢合作!

 





你可能感兴趣的:(script)