【9】QT網絡編程

在QT的網路模塊中提供了網絡編程的相關接口來實現http的訪問,其中包含了一些低級的類:QTcpSocket、QTcpServer和QUdpSocket,和一些高級的類:QNetworkRequest、QNetworkReply和QNetworkAccessManager,我們現在主要使用這些高級的類來實現網頁的獲取。

實現簡單網頁獲取

我們可以創(chuàng)建一個控制臺程序來獲取一些數據。主要是在這個文件中加入network,就可以進行網絡編程了。

#qtspider.pro
QT += core network

QT -= gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

TARGET = qtspider
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

HEADERS +=
//main.cpp
#include <QApplication>
#include <QtNetwork>
#include <QDebug>
#include <QString>
#include <QWidget>

#include <stdio.h>

class qtspider:public QWidget
{
    Q_OBJECT

public:
    explicit qtspider(QWidget *parent = 0);

private slots:
    void replyfinish(QNetworkReply *);

private:
    QNetworkAccessManager *manager;
    QString *content;
};


qtspider::qtspider(QWidget *parent)
{
    content = new QString();
    manager=new QNetworkAccessManager(this);
    connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyfinish(QNetworkReply *)));
    manager->get(QNetworkRequest(QUrl("http://www.itdecent.cn/c/RfYyQj")));
}

//這里使用正則表達式來從獲取網頁中得到我們需要的數據,這里寫的比較簡單。
void qtspider::replyfinish(QNetworkReply *reply)
{
    QString result=reply->readAll();

    QRegExp exp("<a class=\"title\" target=\"_blank\" href=\"(.*)\">(.*)</a>");
    exp.setMinimal(true);
    int pos=0;
    while((pos=exp.indexIn(result,pos))!=-1){
        qDebug()<<pos;
        qDebug() << exp.cap(1);
        qDebug()<<exp.cap(2);
        pos += exp.matchedLength();
    }
    reply->deleteLater();
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    qtspider *spider=new qtspider();

    return a.exec();
}
#include "main.moc"

最后這一段簡單的代碼獲取的是簡書散文主題當前頁文章的標題,至于如何得到更多信息,還得研究一下,結果是這樣的:

2017-04-26_212823.png

錯誤:undefined reference to "vtable for xxx"
解決:在main.cpp的末尾加上

#include "main.moc"

關于這個錯誤的詳細分析請參考以下這篇文章:
http://blog.csdn.net/baymoon/article/details/1409167

另外,關于正則表達式,這里分享給大家一個關于正則表達式測試的工具:
http://regexpal.isbadguy.com/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,694評論 19 139
  • SpringDataJPA學習記錄(三)--復雜查詢的封裝 標簽(空格分隔): springJPA 1.使用Cri...
    此博廢棄_更新在個人博客閱讀 10,265評論 10 13
  • 分享和溝通一樣,要求突出重點,簡單明了。不啰嗦,不重復。最后補充表達謝意和關懷。 NLP講:...
    翩翩e少年閱讀 335評論 0 1
  • 給自己 買三十歲蛋糕的時候 沒想到 我扯著嗓子喊了三遍 店員才聽見我說 我三十歲了 當然 其他顧客也都聽見了 更沒...
    向日葵愛呀愛太陽閱讀 124評論 0 0

友情鏈接更多精彩內容