【9】QT网络编程

在QT的网路模块中提供了网络编程的相关接口来实现http的访问,其中包含了一些低级的类:QTcpSocket、QTcpServer和QUdpSocket,和一些高级的类:QNetworkRequest、QNetworkReply和QNetworkAccessManager,我们现在主要使用这些高级的类来实现网页的获取。

实现简单网页获取

我们可以创建一个控制台程序来获取一些数据。主要是在这个文件中加入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 
#include 
#include 
#include 
#include 

#include 

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.jianshu.com/c/RfYyQj")));
}

//这里使用正则表达式来从获取网页中得到我们需要的数据,这里写的比较简单。
void qtspider::replyfinish(QNetworkReply *reply)
{
    QString result=reply->readAll();

    QRegExp exp("(.*)");
    exp.setMinimal(true);
    int pos=0;
    while((pos=exp.indexIn(result,pos))!=-1){
        qDebug()<deleteLater();
}


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

    qtspider *spider=new qtspider();

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

最后这一段简单的代码获取的是散文主题当前页文章的标题,至于如何得到更多信息,还得研究一下,结果是这样的:

【9】QT网络编程_第1张图片
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/

你可能感兴趣的:(【9】QT网络编程)