程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何用QT實現地址或域名到所在城市的轉換

如何用QT實現地址或域名到所在城市的轉換

編輯:關於C語言

這裡故事的背景是這樣的,這裡主要實現一個ip138網站這樣的功能,這裡先看下ip138實現了說明樣的功能

這裡的您的IP和後面的來自,就是我們感興趣的信息了,你可以在你的軟件中加如這樣的信息來獲取自己的IP,並且獲取來自說明地方,當然你也能獲取到別人的信息,但是這樣做可能就會像彩虹QQ那樣是有風險的,閒話少說,這裡我也是參考了網上一些資源,大部分都是錯的,一個典型代表就是這篇http://bbs.csdn.net/topics/300170507文章中的代碼,不知道原始作者是誰,但可能是很久的帖子了,網站內部可能已經更換了運行機制,有人說是重定向了,這裡本人對這方面不是很了解,姑且認為是這樣的吧。這使得我們下載到的文件裡面是不包含我們需要的這些信息的,但是這些信息明明就在那裡,這麼近那麼遠有木有!

   實際解決問題的方案很簡單,就是主動給網頁發請求,並將網頁返回的東西收集過來,並對收集的內容進行分析結果就出來了,這裡還是直接給出代碼,然後進行講解

QString getIpLocation()
{
    //網頁地址
    const QString URLSTR = QString::fromStdWString(IP138);
    QUrl url(URLSTR);
    QNetworkAccessManager manager;
    QEventLoop loop;
    //發出請求
    QNetworkReply *reply = manager.get(QNetworkRequest(url));
    //請求結束並下載完成後,退出子事件循環
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    //開啟子事件循環
    loop.exec();
    //對得到的網頁文本code進行信息提取
    QString code = reply->readAll();
    QString lcenter = "<center>";
    QString rcenter = "</center>";
    int lIndex = code.indexOf(lcenter);
    QString left = code.left(lIndex + lcenter.length());
    code.replace(left, "");
    int rIndex = code.indexOf(rcenter);
    QString result = code.left(rIndex);
    return result;
}

這個函數是對IP138這個網頁,這個網頁我寫在了宏裡面

#define IP138                L"http://iframe.ip138.com/ic.asp"

打開這個網頁你能看到這樣的東西

這裡就是網頁反饋給我們的東西了,我們使用QNetworkAccessManager這個類的get方法,這裡有必要對這個方法進行一個簡單的說明

QNetworkReply * QNetworkAccessManager::get ( const QNetworkRequest & request )

當准備好接收的時候給給目標發送一個readyRead()信號,並返回QNetworkReply類型的對象,簡單的說就是通過request發送信號給目標,並通過返回值取回網頁返回的信息,也包括這個網頁的信息頭。

   這裡7-13行進行的是一個消息循環,這個循環的結束時reply發送了finish()信號,當然這個finish()信號是那邊服務器在發送完這個網頁的信息之後附帶發送的,不是程序員去觸發的,這個信號對應的槽quit()也是系統自動去執行,退出消息循環,這裡我覺得我們可以通過主動發送信號,不管是什麼信號,可以不是finish()信號,但把這個信號連接到quit()這個槽上,這裡就能實現我們自己的強制結束消息循環了。

   QNetworkReply這個類包含一些發送的數據和頭,像QNetworkRequest包含的就是URL,頭,還有響應狀態和響應內容的本身,15行是講讀取到的數據全部讀出來存在code裡面,下面是對code內容的解析,這裡由於我們需要的信息在<center>和</center>之間,所以後面的處理都是針對我們需要的信息進行的特殊處理,這裡不做更多的說明了。


這裡應該都很好理解,想說的是後面的操作,這裡在用這些類的時候應該增加頭文件#include <QtNetwork>,但是你會發現,加了之後仍然編譯不過去,這裡就需要手動的去改下我們的pro文件,增加這樣的QT += network,把network這個庫包進來,這樣在編譯就可以過了。

   這裡有必要對這個QNetworkRequest引起注意,這裡我們是對一個網頁發出簡單的請求,我們可以向這個網頁發出其它的請求要求它給我們做出一些反饋,比如一些抽獎類的網頁,我們就可以通過這樣的方法做成外掛,一鍵抽獎。




本文出自 “賣萌程序員” 博客,請務必保留此出處http://7677869.blog.51cto.com/7667869/1284519

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved