赞
踩
QT自身有着完善的网络管理体系,既支持底层协议,也支撑上层封装。
本文介绍三个常用类和实践代码
一个通用的网络体系大概步骤如下
private:
QNetworkAccessManager* manager;
QNetworkReply* reply;
private slots:
void finishSlot(QNetworkReply*reply);
QNetworkAccessManager是管理类
QNetworkReply是相应类
finishSlot是接收相应的槽
MainWindow::manager = new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(finishSlot(QNetworkReply*)));
void MainWindow::finishSlot(QNetworkReply *reply)
{
ui->strLab->setText("This is a text");
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString all = codec->toUnicode(reply->readAll());
ui->strLab->setText(all);
}
manager->get(QNetworkRequest(QUrl("http://localhost:8080/")));
reply->deleteLater();
不同于new运算符的是,QT使用了智能销毁的函数deleteLater,这个函数会自动判断合适的时机将资源销毁。
QT有着较为优秀的内存回收机制,当对象数量有对象树结构化的支持时,相关对象会按照对象树的规则自动销毁,避免了内存溢出的情况。
不过QT在内存管理方面需要编者着重注意内存问题,例如越界检查和野指针。
当你的QT内存管理出现问题时往往会和当前系统其它使用QT编写的应用程序发生冲突,尤其是Windows平台下的一系列第三方服务。
经验来讲,野指针和内存越界的问题是引起蓝屏的主要根源。有时也会引起搜狗输入法的程序冲突。
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString all = codec->toUnicode(reply->readAll());
因为reply对象返回的是字节序,字节数组,是完全按照http返回的二进制数据
因此如果想要得到中文或者其他形式的编码,则需要进行二次编码
使用QTextCodec进行编码
编码结果得到的是QString
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。