Qt 利用线程每秒获取网页数据并保存

所需模块

QT += core gui
QT += axcontainer
QT += network

头文件

#include  <QObject>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QThread>
#include <QUrl>
#include <QMainWindow>
#include <QString>
#include <QDebug>
#include <QFile>
#include <QPushButton>

创建线程

新建MyThread.h

#include <QObject>
class MyThread : public QObject
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    void myTimeout();
    void setFlag(bool flag = true);
signals:
    void mySignal();
public slots:
private:
    bool isStop;
};

在生成的MyThread.cpp中添加线程响应


#include "mythread.h"
#include <QThread>
#include<QDebug>
MyThread::MyThread(QObject *parent) : QObject(parent)
{
    isStop = false;

}

void MyThread::myTimeout()
{
    while(isStop == false)
    {
        QThread::sleep(3);//强制暂停3秒,使得每三秒产生一次信号,
        emit mySignal();//每3秒发送一次信号给mainwindow.cpp
        qDebug()<<"子线程号"<<QThread::currentThread();
    }
}

void MyThread::setFlag(bool flag)
{
    isStop = flag;//定义标志位用于判断线程是否终止
}

在mainwindows.h中添加相应函数


class MainWindow : public QMainWindow
{
  Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void dealSignal();//处理子线程响应函数,
    void dealClose();//关闭线程响应

signals:
    void startThread();//开启线程信号
private slots:
    void finishedSlot();
    
 private:
    Ui::MainWindow *ui;
   QPushButton pushButton_StartReading;
    MyThread *myT;
   QThread *thread;    
    QNetworkAccessManager *m_NetManger;
    QNetworkReply *m_Reply;
};


在.cpp文件中进行各个函数的攥写

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QThread>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
  //代码生成一个按钮,用于网络数据读取的触发方式
    pushButton_StartReading.setParent(this);
    pushButton_StartReading.setText("startReading");
    pushButton_StartReading.move(45,90);
    pushButton_StartReading.setMaximumSize(100,30);
    connect(&pushButton_StartReading,&QPushButton::pressed,this,&MainWindow::on_pushButton_StartReading);

 //网络获取数据部分
 
    myT = new MyThread;

    thread = new QThread(this);

    myT->moveToThread(thread);

    connect(myT, &MyThread::mySignal, this, &MainWindow::dealSignal);

    qDebug()<<"主线程号"<<QThread::currentThread();
    //
    connect(this, &MainWindow::startThread,myT, &MyThread::myTimeout);
    //当窗口销毁时,关闭线程
    connect(this,&MainWindow::destroyed, this, &MainWindow::dealClose);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//网络信号响应
void MainWindow::dealSignal()
{ 
    m_NetManger = new QNetworkAccessManager;
    QUrl url(https://www.bilibili.com/);
    m_Reply = m_NetManger->get(QNetworkRequest(url));
    connect(m_Reply,SIGNAL(readyRead()),this,SLOT(finishedSlot()));
   
}
//网络信号结束响应
void MainWindow::dealClose()
{
    if(thread->isRunning() == false)//判断线程是否终止
    {
        return;
    }
    myT->setFlag(true);
    thread->quit();
    thread->wait();//将等待线程完成本次响应操作后终止
    delete myT;
}

void MainWindow::on_pushButton_StartReading()
{
    if(thread->isRunning() == true)//判断此时线程是否正在运行,运行中则无视点击
    {
        return ;
    }
    thread->start();
    myT->setFlag(false);
    emit startThread();//启动线程
}
void MainWindow::finishedSlot()
{
    m_Reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    m_Reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
    //ui->textBrowser->setText(string);可以添加ui控件观察内容
    if(m_Reply->error() == QNetworkReply::NoError)
    {
        QByteArray bytes = m_Reply->readAll();
        QString string =QString::fromUtf8(bytes);
      
       // QRegularExpression re(R"(\{[\s\S]*\]\})");//正则表达式,用于取出合适数据
        //QRegularExpressionMatch match = re.match(string);
        //string = match.captured();

        QFile file(../1.txt);//将网页内容保存为1.txt,保存在上层目录中
        file.open(QIODevice::WriteOnly|QIODevice::Truncate);
        QTextStream out(&file);
        out.setCodec("UTF-8");
        out<<string<<endl;
        file.close();
    }
    else
    {
        qDebug()<<m_Reply->errorString();
    }
    m_Reply->deleteLater();
}
//可以通过ui控件添加pushButton_Stop按钮,建立槽函数触发dealclose()
void MainWindow::on_pushButton_Stop_clicked()
{
    dealClose();
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值