最近在用qt写一个采集软件,请求一些数据,用python代码请求完全没问题,然后用qt代码进行测试,代码如下所示
void Scraping::getRequest(QString id, QStringList list)
{
if (id != "") {
// 省略其他代码...
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply* reply = manager->get(request);
qDebug() << "开始采集";
// 连接QNetworkReply的finished信号到槽函数
connect(reply, &QNetworkReply::finished, this, [=]() {
getData(reply);
reply->deleteLater(); // 释放reply对象
});
}
else {
qDebug() << "数据不为空";
}
}
void Scraping::getData(QNetworkReply *reply)
{
if (reply->error() == QNetworkReply::NoError) {
QByteArray data = reply->readAll();
qDebug() << "result:" << data;
// 在这里处理返回的数据
}
else {
qDebug() << "请求错误:" << reply->errorString();
}
}
差不多我就按照这样来的,运行后发现代码一直卡死,等了很久也没有任何反应,然后查阅资料发现是返回的数据过大导致了卡死,为了解决这个问题,我尝试使用QNetworkReply
的readyRead
信号来读取返回的数据,而不是在finished
信号中一次性读取所有数据,这样可以确保在数据可用时立即读取,而不会阻塞主线程。
修改后的代码如下所示
void Scraping::getRequest(QString id, QStringList list)
{
if (id != "") {
// 省略其他代码...
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply* reply = manager->get(request);
qDebug() << "开始采集";
// 连接QNetworkReply的readyRead信号到槽函数
connect(reply, &QNetworkReply::readyRead, this, [=]() {
QByteArray data = reply->readAll();
qDebug() << "result:" << data;
// 在这里处理返回的数据
});
// 连接QNetworkReply的finished信号到槽函数
connect(reply, &QNetworkReply::finished, this, [=]() {
reply->deleteLater(); // 释放reply对象
});
}
else {
qDebug() << "数据不为空";
}
}
效果如下所示
完美解决!
点击此处登录后即可评论