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 ] "

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

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

来自为知笔记(Wiz)

时间: 2024-12-25 18:19:11

QT学习之QScript的相关文章

Qt学习之路

  Qt学习之路_14(简易音乐播放器) Qt学习之路_13(简易俄罗斯方块) Qt学习之路_12(简易数据管理系统) Qt学习之路_11(简易多文档编辑器) Qt学习之路_10(Qt中statusBar,MessageBox和Timer的简单处理) Qt学习之路_9(Qt中Item Widget初步探索) Qt学习之路_8(Qt中与文件目录相关操作) Qt学习之路_7(线性布局和网格布局初步探索) Qt学习之路_6(Qt局域网聊天软件) Qt学习之路_5(Qt TCP的初步使用) Qt学习之路

QT学习之路(1):彩票绝对不中模拟器

//============================================//绝对不中,彩票开奖模拟器#include "mainwindow.h"#include "ui_mainwindow.h"#include <QHash>#include <QDebug>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::M

qt学习(三):鼠标图标改变

qt学习 (三):鼠标图标改变 当你进入一个美好的qt软件场景,比如游戏,电脑的黑白图标会让程序逊色不少, 1改图标要加光标的头文件, 2 载入光标图, 3 再设置改光标就可以了 1在头文件中加 #include <QtGui>  //光标类的父类 //再在public成员中声明换的函数void keyPressEvent(QKeyEvent *k); //声明按键换图的函数         .h文件    --注意头文件和声明 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Qt学习总结-ui篇(二)

qccs定义圆角 border-radius:10px; 如果想给特定位置定义圆角,如: 左上角:border-left-top-radius:10px; 右下角色:border-right-bottom-rasius:10px; 半透明效果 只需要在css中使用rgba(100,100,100,40)这种形式来表示颜色即可. 为可执行文件添加图标 1.新建文件:finename.rc 文件名无所谓,只要后缀为rc就可以. 2.编辑新建的文件,输入以下内容: IDI_ICON1 ICON DIS

【qt学习005】搞不明白的布局

记录一下自己在布局这一章遇见的各种狗屎问题. 问题主要出现在布局最后一节:综合布局实例,类似于一个qq管理器的界面(见下图1).看见这个时,打算动手实现一下,于是开始写代码,写着写着发现不知道怎么写了,遇见一些无法解决的问题(问题中描述的布局类之间的关系见下图2): 1. 最底层应该使用哪一类? 2. 怎么将QListWidget加入到最底层? 3. 怎么往QStackWidget加入三个页面,每个页面代表不同的信息? 4. 怎么将QHBoxLayout中的CLOSE按钮连接到退出函数,要完整地

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

QT学习第1天

QT学习第一天  坚持住!! 一 Qt概述 1.Qt发展历史 (1)1991年诞生(Haavard Nord/Eirik Chambe-Eng), (2)1994年创立Troll Tech(奇趣科技) (3)2005年QT4.0 (4)2008年被Nokia收购 (5)2009年源代码开源 (6)2012年Nokia将全部QT业务和知识产权卖给Digia公司 (7)2013年QT5.0 QT5.1 QT5.2 (8)2014年Digia公司成立 The Qt Company子公司 2.Qt5.4

QT学习之路--创建一个对话框

Q_OBJECT:这是一个宏,凡是定义信号槽的类都必须声明这个宏. 函数tr()全名是QObject::tr(),被他处理过的字符串可以使用工具提取出来翻译成其他语言,也就是做国际化使用. 对于QT学习之路:Qt学习之路(7):创建一个对话框(上)这个程序.编译出现 invalid use of incomplete type ‘class QPushButton’ findButton->setEnabled(!text.isEmpty()); ^ In file included from

qt学习(四)主窗选钮,显示新窗口。

游戏有选区这个习惯, 当然,我特指<冒险岛>了,有的时候就是打开一个主屏幕上五个按钮让你点击进入, 甚至有的时候进去了还要选哪个频道,游戏服务器都得分区,频道来完成功能.现在我们先进入想选的区,不需要的可以看以后的登陆窗口了. 这一次的主要功能是完成选区,选完进入输入账号界面. 这次用的是一个点完出啦一个所以需要两个窗口,在原有的基础上新建qt设计师界面类.选择dialogwithoutbutton. 把最后一个要显示的当作主界面, 其他的都可以选择dialog模板, 完成以后,画ui界面,