zoukankan      html  css  js  c++  java
  • 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+" "+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("程序已运行完成! 关闭窗口退出程序。。。");
        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 ] "

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

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

     





  • 相关阅读:
    easyui_1
    JSONOBJECT
    基础回顾—list遍历4种
    <input type=file>上传唯一控件
    window.open
    poi--导入
    java字符串的替换
    一、IIS搭建前端静态模板_资源加载问题
    一、ASP.NET Iframework_SignalR集线器类(v2)
    一、ASP.NET Iframework_SignalR永久连接类(v2)
  • 原文地址:https://www.cnblogs.com/lomper/p/4138281.html
Copyright © 2011-2022 走看看