QT开发(六十二)———QT5解析Json文件

QT开发(六十二)———QT5解析Json文件

一、QT5 Json简介

QT4中使用第三方库QJson解析JSON文件。

QT5新增加了处理JSON的类,类均以QJson开头,包含在QtCore模块中。QT5新增加六个相关类:


QJsonArray


封装 JSON 数组


QJsonDocument


读写 JSON 文档


QJsonObject


封装 JSON 对象


QJsonObject::iterator


用于遍历QJsonObject的STL风格的非const遍历器


QJsonParseError


报告 JSON 处理过程中出现的错误


QJsonValue


封装 JSON 值

二、QJsonDocument

1、QJsonDocument简介

QJsonDocument提供了读写Json文档的方法。

QJsonDocument是一个包含了完整JSON文档的类,支持以UTF-8编码的文本和QT自身的二进制格式来读写JSON文档。

JSON文档可以使用QJsonDocument::fromJson()将基于JSON文档的文本形式转换为QJsonDocument对象,toJSON()可以将QJsonDocument转换回文本形式。
    解析文档的有效性可以使用 !isNull() 进行查询。
    使用isArray()和isObject()可以分别查询一个文档是否包含了一个数组或一个object。使用array()或object()可以将包含在文档中的数组或object提取出来。
    使用fromBinaryData()或fromRawData()也可以从一个二进制形式创建一个QJsonDocument对象。

2、QJsonDocument成员函数

[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate)

Validation决定数据是否在使用前检查数据有效性。

[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)

将json解析为UTF-8的JSON文档

[static] QJsonDocument QJsonDocument::fromRawData(const char *data, int size, DataValidation validation = Validate)

使用data数据的前size字节创建一个QJsonDocument对象

[static] QJsonDocument QJsonDocument::fromVariant(const QVariant &variant)

根据variant创建QJsonDocument对象

bool QJsonDocument::isArray() const

bool QJsonDocument::isEmpty() const

bool QJsonDocument::isNull() const

bool QJsonDocument::isObject() const

QJsonObject QJsonDocument::object() const

返回文档中包含的QJsonObject对象

const char *QJsonDocument::rawData(int *size) const

返回size大小的二进制数据

void QJsonDocument::setArray(const QJsonArray &array)

设置array作为文档中的主对象

void QJsonDocument::setObject(const QJsonObject &object)

设置object作为文档中的主对象

QByteArray QJsonDocument::toBinaryData() const

返回文档的二进制格式数据

QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const

将QJsonDocument转换为UTF-8编码的format格式的JSON文档

QVariant QJsonDocument::toVariant() const

返回JSON文档的QVariant格式

3、QJsonDocument对象的构建

A、QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR)

fromJson()可以由QByteArray对象构造一个QJsonDocument对象

QJsonObject json;
json.insert("name", QString("Qt"));
json.insert("version", 5);
json.insert("windows", true);
QJsonDocument document;
document.setObject(json);
QByteArray byte_array = document.toJson(QJsonDocument::Compact);
QJsonParseError json_error;
QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);

B、QJsonDocument fromVariant(const QVariant &variant)

QVariantList people;
QVariantMap bob;
bob.insert("Name", "Bob");
bob.insert("Phonenumber", 123);
QVariantMap alice;
alice.insert("Name", "Alice");
alice.insert("Phonenumber", 321);
people << bob << alice;
QJsonDocument jsonDocument = QJsonDocument::fromVariant(people);
if (!jsonDocument.isNull()) 
{
    qDebug() << jsonDocument.toJson();
}

C、QJsonDocument fromRawData(const char *data, int size, DataValidation validation = Validate)

D、QJsonDocument fromBinaryData(const QByteArray &data, DataValidation validation = Validate)

三、QJsonArray

1、QJsonArray简介

QJsonArray封装了JSON数组。

JSON数组是值的链表,可以插入和删除QJsonValue。

QJsonArray与QVariantList可以相互转换。QJsonArray可以用size(), insert(), removeAt()进行操作,还可以用标准C++的迭代器模式来迭代其内容。
    QJsonArray是一个隐式共享的类,只要没有被改变,可以和创建QJsonArray的document共享数据。
    通过QJsonDocument可以将一个QJsonArray转换成或转换自一个文本形式的JSON。

2、QJsonArray成员函数

QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)

构建一个QJsonArray

QJsonArray::QJsonArray(const QJsonArray &other)

void QJsonArray::append(const QJsonValue &value)

在QJsonArray尾部插入value

QJsonValue QJsonArray::at(int i) const

返回QJsonArray中索引为i的QJsonValue值

iterator QJsonArray::begin()

const_iterator QJsonArray::begin() const

返回指向数组第一个元素的STL风格迭代器

const_iterator QJsonArray::constBegin() const

返回指向数组第一个元素的const STL风格迭代器

const_iterator QJsonArray::constEnd() const

返回指向数组最后一个元素后的位置的const STL风格迭代器

bool QJsonArray::contains(const QJsonValue &value) const

如果数组中包含value,返回true

int QJsonArray::count() const

返回数组的大小

bool QJsonArray::empty() const

如果数组为空,返回true

const_iterator QJsonArray::end() const

返回指向数组最后一个元素后的位置的STL风格迭代器

iterator QJsonArray::erase(iterator it)

删除迭代器it指向的元素,返回指向下一个元素的迭代器

QJsonValue QJsonArray::first() const

返回数组中的第一个值

[static] QJsonArray QJsonArray::fromStringList(const QStringList &list)

将一个字符串链表list转换为QJsonArray

[static] QJsonArray QJsonArray::fromVariantList(const QVariantList &list)

将链表list转换为QJsonArray

四、QJsonObject

1、QJsonObject简介

QJsonObject类用于封装JSON对象。JSON对象是包含键值对的链表,其中键是唯一的字符串,其值由QJsonValue代表。

QJsonObject可以与QVariantMap相互转换,可以用size()来获得键值对的数目,insert()、remove()分别用来插入和删除pair。可以用标准C++的迭代器模式(iterator pattern)来迭代其内容。
    QJsonObject是一个隐式共享的类,只要没有被改变过,QJsonObject会和创建它的document共享数据。
    可以通过QJsonDocument将QJsonObject和文本格式相互转换。

2、QJsonObject成员函数

QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > args)

使用键值对链表构建QJsonObject对象

QJsonObject::QJsonObject(const QJsonObject &other)

iterator QJsonObject::begin()

const_iterator QJsonObject::begin() const

返回指向JSON对象的第一个元素的STL风格的迭代器

const_iterator QJsonObject::constBegin() const

返回指向JSON对象的第一个元素的const STL风格的迭代器

const_iterator QJsonObject::constEnd() const

返回SJON对象的最后一个元素后的位置的const STL风格的迭代器

const_iterator QJsonObject::constFind(const QString &key) const

返回一个指向键值对中键为key的元素的const迭代器

bool QJsonObject::contains(const QString &key) const

如果JSON对象中包含键key,返回true

int QJsonObject::size() const

int QJsonObject::count() const

返回JSON对象中键值对的数量

bool QJsonObject::empty() const

bool QJsonObject::isEmpty() const

如果JSON对象为空,返回true

iterator QJsonObject::find(const QString &key)

const_iterator QJsonObject::find(const QString &key) const

返回指向JSON对象中键为key的键值对的迭代器

[static] QJsonObject QJsonObject::fromVariantHash(const QVariantHash &hash)

将hash转换为JSON对象

[static] QJsonObject QJsonObject::fromVariantMap(const QVariantMap &map)

将map转换为JSON对象

iterator QJsonObject::insert(const QString &key, const QJsonValue &value)

插入键为key,值为value的键值对,返回插入键值对的迭代器

QStringList QJsonObject::keys() const

返回JSON对象的所有键的链表

void QJsonObject::remove(const QString &key)

删除JSON对象中的key

QJsonValue QJsonObject::take(const QString &key)

删除JSON对象中的键key,返回key对应的QJsonValue

QVariantHash QJsonObject::toVariantHash() const

将JSON对象转换为QVariantHash

QVariantMap QJsonObject::toVariantMap() const

将JSON对象转换为QVariantMap

QJsonValue QJsonObject::value(const QString &key) const

返回key对应的QJsonValue值

五、QJsonParseError

1、QJsonParseError简介

QJsonParseError类用于在JSON解析中报告错误。


常量


 


描述


QJsonParseError::NoError


0


未发生错误


QJsonParseError::UnterminatedObject


1


对象不正确地终止以右花括号结束


QJsonParseError::MissingNameSeparator


2


分隔不同项的逗号丢失


QJsonParseError::UnterminatedArray


3


数组不正确地终止以右中括号结束


QJsonParseError::MissingValueSeparator


4


对象中分割 key/value 的冒号丢失


QJsonParseError::IllegalValue


5


值是非法的


QJsonParseError::TerminationByNumber


6


在解析数字时,输入流结束


QJsonParseError::IllegalNumber


7


数字格式不正确


QJsonParseError::IllegalEscapeSequence


8


在输入时,发生一个非法转义序列


QJsonParseError::IllegalUTF8String


9


在输入时,发生一个非法 UTF8 序列


QJsonParseError::UnterminatedString


10


字符串不是以引号结束


QJsonParseError::MissingObject


11


一个对象是预期的,但是不能被发现


QJsonParseError::DeepNesting


12


对解析器来说,JSON 文档嵌套太深


QJsonParseError::DocumentTooLarge


13


对解析器来说,JSON 文档太大


QJsonParseError::GarbageAtEnd


14


解析的文档在末尾处包含额外的乱码

2、QJsonParseError成员函数

QString QJsonParseError::errorString() const

返回JSON解析错误时报告的错误信息

五、QJsonValue

1、QJsonValue简介

QJsonValue类封装了JSON中的值。JSON中的值有6种基本类型:

bool           QJsonValue::Bool

double         QJsonValue::Double

string         QJsonValue::String

array          QJsonValue::Array

object         QJsonValue::Object

null           QJsonValue::Null

Undefined      QJsonValue::Undefined

value可以是以上任何一种数据类型。另外,QJsonValue有一个特殊的flag来表示未定义类型。可以用isUndefined()来查询。 
    可以用type()或isBool(),、isString()等来查询value的类型。类似的,可以用toBool()、toString()等将一个value转换成存储在该value内部的类型。

2、QJsonValue成员函数

[static] QJsonValue QJsonValue::fromVariant(const QVariant &variant)

将variant转换为QJsonValue

bool QJsonValue::isArray() const

如果QJsonValue包含一个数组,返回true

bool QJsonValue::isBool() const

如果QJsonValue包含一个bool,返回true

bool QJsonValue::isDouble() const

如果QJsonValue包含一个double,返回true

bool QJsonValue::isNull() const

如果QJsonValue包含一个Null,返回true

bool QJsonValue::isObject() const

如果QJsonValue包含一个object,返回true

bool QJsonValue::isString() const

如果QJsonValue包含一个string,返回true

bool QJsonValue::isUndefined() const

如果QJsonValue包含一个undefined,返回true

QJsonArray QJsonValue::toArray(const QJsonArray &defaultValue) const

将QJsonValue转换为QJsonArray并返回,如果类型不是array,返回默认值defaultValue

QJsonArray QJsonValue::toArray() const

将QJsonValue转换为QJsonArray并返回

bool QJsonValue::toBool(bool defaultValue = false) const

将QJsonValue转换为bool并返回

double QJsonValue::toDouble(double defaultValue = 0) const

将QJsonValue转换为double并返回

int QJsonValue::toInt(int defaultValue = 0) const

将QJsonValue转换为int并返回

QJsonObject QJsonValue::toObject(const QJsonObject &defaultValue) const

QJsonObject QJsonValue::toObject() const

将QJsonValue转换为QJsonObject并返回

QString QJsonValue::toString(const QString &defaultValue = QString()) const

将QJsonValue转换为QString并返回

Type QJsonValue::type() const

返回QJsonValue的类型

六、JSON解析编程

1、JSON解析流程

JSON解析的流程如下:

A、将对应的字符串生成QJsonDocument对象

B、判断QJsonDocument对象是QJsonObject还是QJsonArray

C、如果是QJsonObject类型,获取一个QJsonObject对象,然后根据QJsonObject的API函数进行解析

D、如果是QJsonArray类型,获取一个QJsonArray对象,然后根据QJsonArray的API函数进行解析

E、根据获取的QJsonObject或QJsonArray取得QJsonValue类型的数据

F、迭代分解数据获取各个值

JSON解析流程实例:

#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QString>
#include <QStringList>
#include <QDebug>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QString json("{\"name\":\"scorpio\", \"year\":2016, \"array\":[30, \"hello\", true]}");
    QJsonParseError jsonerror;
    QJsonDocument doc = QJsonDocument::fromJson(json.toLatin1(), &jsonerror);
    if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError)
    {
        if(doc.isObject())
        {
            QJsonObject object = doc.object();
            QStringList list = object.keys();
            for(int i = 0; i < list.count(); i++)
            {
                qDebug() << list.at(i);
            }
            QJsonObject::iterator it = object.begin();
            while(it != object.end())
            {
                switch(it.value().type())
                {
                case QJsonValue::String:
                {
                    qDebug() << "Type is string";
                    QJsonArray sub = it.value().toArray();
                    qDebug() << it.key() << "=" << it.value().toString();
                    break;
                }
                case QJsonValue::Array:
                {
                    qDebug() << "Type is Array";
                    qDebug() << it.key() << "=" << it.value().toArray();
                    QJsonArray sub = it.value().toArray();
                    qDebug() << "index 1:" << sub.at(0).toDouble();
                    qDebug() << "index 2:" << sub.at(1).toString();
                    qDebug() << "index 3:" << sub.at(2).toBool();
                    break;
                }
                case QJsonValue::Bool:
                {
                    qDebug() << "Type is Bool";
                    qDebug() << it.key() << "=" << it.value().toBool();
                    break;
                }
                case QJsonValue::Double:
                {
                    qDebug() << "Type is Double";
                    qDebug() << it.key() << "=" << it.value().toDouble();
                    break;
                }
                case QJsonValue::Object:
                {
                    qDebug() << "Type is Object";
                    qDebug() << it.key() << "=" << it.value().toObject();
                    break;
                }
                case QJsonValue::Null:
                {
                    qDebug() << "Type is Null";
                    qDebug() << it.key() << "= NULL" ;
                    break;
                }
                case QJsonValue::Undefined:
                {
                    qDebug() << "Type is Undefined";
                    break;
                }
                }
                it++;
            }
        }
    }
 
    return a.exec();
}

2、QJsonObject

JSON对象:

{

"Cross Platform": true,

"From": 2016,

"Name": "Qt"

}

A、构建JSON对象

// 构建 JSON 对象

QJsonObject json;

json.insert("Name", "Qt");

json.insert("From", 2016);

json.insert("Cross Platform", true);

B、构建JSON文档

// 构建 JSON 文档

QJsonDocument document;

document.setObject(json);

QByteArray byteArray = document.toJson();

QString strJson(byteArray);

C、解析JSON

 QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
    { 
        if (doucment.isObject())
        { 
            QJsonObject object = doucment.object();  
            if (object.contains("Name"))
            {  // 包含指定的 key
                QJsonValue value = object.value("Name"); 
                if (value.isString())
                {  // 判断 value 是否为字符串
                    QString strName = value.toString(); 
                    qDebug() << "Name : " << strName;
                }
            }
            if (object.contains("From"))
            {
                QJsonValue value = object.value("From");
                if (value.isDouble())
                {
                    int nFrom = value.toVariant().toInt();
                    qDebug() << "From : " << nFrom;
                }
            }
            if (object.contains("Cross Platform"))
            {
                QJsonValue value = object.value("Cross Platform");
                if (value.isBool())
                {
                    bool bCrossPlatform = value.toBool();
                    qDebug() << "CrossPlatform : " << bCrossPlatform;
                }
            }
        }
    }

3、QJsonArray

JSON数组:

[

"Qt",

5.7,

true

]

A、构建JSON数组

// 构建 JSON 数组

QJsonArray json;

json.append("Qt");

json.append(5.7);

json.append(true);

B、构建JSON文档

// 构建 JSON 文档

QJsonDocument document;

document.setArray(json);

QByteArray byteArray = document.toJson(QJsonDocument::Compact);

QString strJson(byteArray);

C、解析JSON

 QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError); 
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) 
    { 
        if (doucment.isArray()) 
        { 
            QJsonArray array = doucment.array();  
            int nSize = array.size();  
            for (int i = 0; i < nSize; ++i) 
            {  // 遍历数组
                QJsonValue value = array.at(i);
                if (value.type() == QJsonValue::String) 
                {
                    QString strName = value.toString();
                    qDebug() << strName;
                }
                if (value.type() == QJsonValue::Double) 
                {
                    double dVersion = value.toDouble();
                    qDebug() << dVersion;
                }
                if (value.type() == QJsonValue::Bool) 
                {
                    bool bCrossPlatform  = value.toBool();
                    qDebug() << bCrossPlatform;
                }
            }
        }
    }

4、复杂JSON

{

"Company": "Digia",

"From": 1991,

"Name": "Qt",

"Page": {

"Developers": "https://www.qt.io/developers/",

"Download": "https://www.qt.io/download/",

"Home": "https://www.qt.io/"},

"Version": [

4.8,

5.2,

5.7]

}

   // 构建 Json 数组 - Version
    QJsonArray versionArray;
    versionArray.append(4.8);
    versionArray.append(5.2);
    versionArray.append(5.7);
 
    // 构建 Json 对象 - Page
    QJsonObject pageObject;
    pageObject.insert("Home", "https://www.qt.io/");
    pageObject.insert("Download", "https://www.qt.io/download/");
    pageObject.insert("Developers", "https://www.qt.io/developers/");
 
    // 构建 Json 对象
    QJsonObject json;
    json.insert("Name", "Qt");
    json.insert("Company", "Digia");
    json.insert("From", 1991);
    json.insert("Version", QJsonValue(versionArray));
    json.insert("Page", QJsonValue(pageObject));
 
    // 构建 Json 文档
    QJsonDocument document;
    document.setObject(json);
    QByteArray byteArray = document.toJson(QJsonDocument::Compact);
    QString strJson(byteArray);
        //解析JSON
    QJsonParseError jsonError;
    QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);
    if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError))
    {
        if (doucment.isObject())
        {
            QJsonObject object = doucment.object();
            if (object.contains("Name"))
            {
                QJsonValue value = object.value("Name");
                if (value.isString())
                {
                    QString strName = value.toString();
                    qDebug() << "Name : " << strName;
                }
            }
            if (object.contains("Company"))
            {
                QJsonValue value = object.value("Company");
                if (value.isString())
                {
                    QString strCompany = value.toString();
                    qDebug() << "Company : " << strCompany;
                }
            }
            if (object.contains("From"))
            {
                QJsonValue value = object.value("From");
                if (value.isDouble())
                {
                    int nFrom = value.toVariant().toInt();
                    qDebug() << "From : " << nFrom;
                }
            }
            if (object.contains("Version"))
            {
                QJsonValue value = object.value("Version");
                if (value.isArray())
                {
                    QJsonArray array = value.toArray();
                    int nSize = array.size();
                    for (int i = 0; i < nSize; ++i)
                    {
                        QJsonValue value = array.at(i);
                        if (value.isDouble())
                        {
                            double dVersion = value.toDouble();
                            qDebug() << "Version : " << dVersion;
                        }
                    }
                }
            }
            if (object.contains("Page"))
            {
                QJsonValue value = object.value("Page");
                if (value.isObject())
                {
                    QJsonObject obj = value.toObject();
                    if (obj.contains("Home"))
                    {
                        QJsonValue value = obj.value("Home");
                        if (value.isString())
                        {
                            QString strHome = value.toString();
                            qDebug() << "Home : " << strHome;
                        }
                    }
                    if (obj.contains("Download"))
                    {
                        QJsonValue value = obj.value("Download");
                        if (value.isString())
                        {
                            QString strDownload = value.toString();
                            qDebug() << "Download : " << strDownload;
                        }
                    }
                    if (obj.contains("Developers"))
                    {
                        QJsonValue value = obj.value("Developers");
                        if (value.isString())
                        {
                            QString strDevelopers = value.toString();
                            qDebug() << "Developers : " << strDevelopers;
                        }
                    }
                }
            }
        }
    }
时间: 2024-10-23 09:42:42

QT开发(六十二)———QT5解析Json文件的相关文章

QT开发(十二)——QT事件处理机制

QT开发(十二)--QT事件处理机制 一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 鼠标事件: 鼠标移动,鼠标按键的按下和松开 拖放事件: 用鼠标进行拖放 滚轮事件: 鼠标滚轮滚动 绘屏事件: 重绘屏幕的某些部分 定时事件: 定时器到时 焦点事件: 键盘焦点移动 进入和离开事件: 鼠标移入widget之内,或是移出 移动事件: widget的

qt5 解析Json文件

/* test.json */ { "appDesc": { "description": "SomeDescription", "message": "SomeMessage" }, "appName": { "description": "Home", "message": "Welcome", &quo

QT开发(十六)——QT绘图实例-钟表

QT开发(十六)--QT绘图实例-钟表 一.钟表实现原理 钟表的实现需要设置定时器,定时器每隔一秒发送timeout()信号到QWidget::update()槽函数,update()槽函数将会重绘一次窗口,重写重绘事件函数paintEvent(QPaintEvent *event),根据获取的当前系统时间的时钟.分钟.秒钟重绘钟表的时针.分针.秒针. QTimer *timer = new QTimer(this); timer->start(1000);//一秒钟 connect(timer

微信公众平台开发(十二) 发送客服消息

原文:微信公众平台开发(十二) 发送客服消息 一.简介 当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单.订阅事件.扫描二维码事件.支付成功事件.用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数.此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务. 二.思路分析 官方文档中只提供了一个发送客服消息的接口,开发者只要POS

QT开发(十九)——QT内存泄漏问题

QT开发(十九)--QT内存泄漏问题 一.QT对象间的父子关系 QT最基础和核心的类是:QObject,QObject内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children. QT对象之间可以存在父子关系,每一个对象都可以保存它所有子对象的指针,每一个对象都有一个指向其父对象的指针. 当指定QT对象的父对象时,父对象会在子对象链表中加入该对象的指针,该对象会保存指向其父对象的指针. 当QT对象被销毁时,

QT开发(十四)——QT绘图系统

QT开发(十四)--QT绘图系统 一.QT绘图原理 Qt4中的2D绘图系统称为Arthur绘图系统,可以使用相同的API在屏幕上和绘图设备上进行绘制,主要基于QPainter.QPainterDevice和 QPainterEngine.QPainter执行绘图操作,QPainterDevice提供绘图设备,是一个二维空间的抽象,QPainterEngine提供一些接口.QPainter用来执行具体的绘图相关操作,如画点,画线,填充,变换,alpha通道等.QPaintDevice类是能够进行绘

QT开发(十五)——QT坐标系统

QT开发(十五)--QT坐标系统 一.QT坐标系简介 Qt中每一个窗口都有一个坐标系,默认窗口左上角为坐标原点,然后水平向右依次增大,水平向左依次减小,垂直向下依次增大,垂直向上依次减小.原点即为(0,0)点,以像素为单位增减. 二.坐标系变换 坐标系变换是利用变换矩阵来进行的, 通常利用QTransform类来设置变换矩阵.QPainter类提供了对坐标系的平移,缩放,旋转,扭曲等变换函数. void translate(const QPointF & offset) void transla

Go语言开发(十二)、Go语言常用标准库二

Go语言开发(十二).Go语言常用标准库二 一.os 1.os简介 os 包提供了不依赖平台的操作系统函数接口,设计像Unix风格,但错误处理是go风格,当os包使用时,如果失败后返回错误类型而不是错误数量. 2.os常用接口 func Hostname() (name string, err error) // Hostname返回内核提供的主机名 func Environ() []string // Environ返回表示环境变量的格式为"key=value"的字符串的切片拷贝 f

【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

转载自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括,如果你的项目已经在google play 或Apple Store 等平台上架了,那么当你项目需要做一些活动或者修改前端的一些代码等那么你需要重新提交一个新版本给平台,这时候你的上架时候是个不确定的时候,具体什么时候能上架,主要跟平台有关,你再着急,也没有用的. 那么如果你的项目是使用脚本语言进行