目标:获取淘宝网首页搜索框输入一个词后的下拉提示内容
实现:淘宝网的接口
QNetworkAccessManager QnetworkRequest QNetworkReply的使用
Json的处理(淘宝网返回的数据为JSON(似乎为非标准JSON类,但经过简单处理即可)),嵌套JSON的处理.
Qt中QLineEdit 以及QTextEdit的使用,信号与糟。
Qt应用程序打包
开发环境:windows8.1 Qt5.1.0
(原先是使用Qt5.2开发,但是运行到QNetworkAccessManager调用get函数时出现
QSslSocket: cannot resolve TLSv1_2_client_method site:qt-project.org错误,万般百度Google无果后,尝试了下5.1,竟然就不报错了)
关于JSON:JSON分两类,一类为array(即为数组类),一类为object类(可以理解为字典,map,通过取前面的元素获取对应的元素)
关于代码:因淘宝返回的值格式固定,所以我也就没有用到异常处理,这个程序也只是练练手,进一步熟悉Qt的使用,以及Qt网络处理,JSON。
界面图:
以下是部分代码及注释:
//此为按钮clicked后触发的槽事件
void MainWindow::on_pushButton_clicked()
{
QUrl url = "http://suggest.taobao.com/sug?extras=1&code=utf-8&callback=KISSY.Suggest.callback&q="
+ ui->lineEdit->text();
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request); //Qt5.2运行时报错的步骤即为此行
QEventLoop eventLoop; //线程阻塞直至manager接收完毕
QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
eventLoop.exec(); //block until finish
QTextCodec *codec = QTextCodec::codecForName("utf8");
//输出
QString all = codec->toUnicode(reply->readAll());
QString str = "KISSY.Suggest.callback("; //经在线JSON网站测验,返回的并非标准JSON类,故需进一步处理
all.remove(0, str.length());
all.replace(QString(")"), QString(""));
QJsonParseError error;
QJsonDocument json = QJsonDocument::fromJson(all.toUtf8(), &error);
if (error.error == QJsonParseError::NoError) {
if (!(json.isNull() || json.isEmpty())) { //内容为空或者数据为空
if (json.isObject()) { //object类
QJsonObject object = json.object();
QJsonValue value = object.take("result"); //通过take获取对应的QJsonValue
QJsonArray subarray = value.toArray();
int subsize = subarray.size();
//ui->textEdit->append(QString::number(subsize));
for (int i = 0; i < subsize; i++) {
QJsonValue subvalue = subarray.at(i);
QJsonArray subtwo = subvalue.toArray();
QJsonValue subtwovalue = subtwo.at(0);
QString str = subtwovalue.toString();
ui->textEdit->append(str);
}}
} else if (json.isArray()) {
QJsonArray array = json.array();
int size = array.size();
QJsonValue value;
for (int i = 0; i < size; i++) {
value = array.at(i);
QString name = value.toString();
ui->textEdit->append(name);
}
}
} else {
ui->textEdit->append("json failed");// 检查错误类型
}
//ui->textEdit->append(all);
}
Qt应用程序打包:
用到的工具:
1.hap-depends213790 分析Qt程序缺少的dll文件
2.Enigma Virtual Box_7.10 打包应用程序,将需要的dll文件包含进EXE里
备注:Qt编译时选择release,需要的dll文件会小很多,debug版缺少的文件格式一般为*d.dll。