在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/