淘宝获取下拉提示栏

2014年8月10日 22:01:
目标:获取淘宝网首页搜索框输入一个词后的下拉提示内容
     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后触发的槽事件
  1. void MainWindow::on_pushButton_clicked()    
  2. {
  3.     QUrl url = "http://suggest.taobao.com/sug?extras=1&code=utf-8&callback=KISSY.Suggest.callback&q="
  4.             + ui->lineEdit->text();
  5.     QNetworkRequest request(url);
  6.     QNetworkReply *reply = manager->get(request);          //Qt5.2运行时报错的步骤即为此行
  7.     QEventLoop eventLoop;                    //线程阻塞直至manager接收完毕
  8.         QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
  9.         eventLoop.exec();       //block until finish
  10.  
  11.         QTextCodec *codec = QTextCodec::codecForName("utf8");
  12.         //输出
  13.         QString all = codec->toUnicode(reply->readAll());
  14.         QString str = "KISSY.Suggest.callback(";     //经在线JSON网站测验,返回的并非标准JSON类,故需进一步处理
  15.         all.remove(0, str.length());
  16.         all.replace(QString(")"), QString(""));
  17.         QJsonParseError error;
  18.         QJsonDocument json = QJsonDocument::fromJson(all.toUtf8(), &error);
  19.         if (error.error == QJsonParseError::NoError) {
  20.             if (!(json.isNull() || json.isEmpty())) {  //内容为空或者数据为空
  21.                 if (json.isObject()) {         //object类
  22.                    QJsonObject object = json.object();
  23.                    QJsonValue value = object.take("result");      //通过take获取对应的QJsonValue
  24.                    QJsonArray subarray = value.toArray();
  25.                    int subsize = subarray.size();
  26.                    //ui->textEdit->append(QString::number(subsize));
  27.                    for (int i = 0; i < subsize; i++) {
  28.                        QJsonValue subvalue = subarray.at(i);
  29.                        QJsonArray subtwo = subvalue.toArray();
  30.                        QJsonValue subtwovalue = subtwo.at(0);
  31.                        QString str = subtwovalue.toString();
  32.                        ui->textEdit->append(str);
  33.                    }}
  34.                 } else if (json.isArray()) {
  35.                     QJsonArray array = json.array();
  36.                     int size = array.size();
  37.                     QJsonValue value;
  38.                     for (int i = 0; i < size; i++) {
  39.                         value = array.at(i);
  40.                         QString name = value.toString();
  41.                         ui->textEdit->append(name);
  42.                     }
  43.                 }
  44. } else {
  45.             ui->textEdit->append("json failed");// 检查错误类型
  46.         }
  47.         //ui->textEdit->append(all);
  48. }


Qt应用程序打包:
用到的工具:
1.hap-depends213790   分析Qt程序缺少的dll文件
2.Enigma Virtual Box_7.10  打包应用程序,将需要的dll文件包含进EXE里
备注:Qt编译时选择release,需要的dll文件会小很多,debug版缺少的文件格式一般为*d.dll。




posted @ 2014-08-13 21:39  wilbertwu  阅读(561)  评论(0编辑  收藏  举报