gpt4 book ai didi

c++ - 为什么这个 Qt 信号永远不会发出?

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:09 24 4
gpt4 key购买 nike

我正在尝试从网页中获取数据,但是 finished() 信号从未发出!!!我知道我一定做错了什么,但无法弄清楚它是什么。

# webservice.h
class WebService:public QObject
{
Q_OBJECT

public:
explicit WebService(QObject *parent=0);
void getRequest(const QString &urlString);

signals:
void networkError(QNetworkReply::NetworkError ne);
void finished(QNetworkReply*);

public slots:
void parseNetworkResponse(QNetworkReply* finished);

private:
QNetworkAccessManager *netMgr;

public:
QByteArray data;
};

#webservice.cpp
WebService::WebService(QObject *parent):QObject(parent)
{
netMgr = new QNetworkAccessManager;

connect(netMgr, SIGNAL(finished(QNetworkReply*)),
this, SLOT(parseNetworkResponse(QNetworkReply*)));
}

void WebService::getRequest(const QString &urlString)
{
QUrl url(urlString);
QNetworkRequest req;
emit finished(netMgr->get(req));
}

void WebService::parseNetworkResponse(QNetworkReply *finished)
{
if (finished->error() != QNetworkReply::NoError)
{
emit networkError(finished->error());
return;
}

data = finished->readAll();

qDebug() << data;
}

data 从未按预期分配值。

最佳答案

您没有将 url 传递给您创建的 QNetworkRequest。尝试:

QNetworkRequest req(url);

WebService::getRequest() 中。


根据要求,这里修改了源代码以允许它在 QtCreator 中作为控制台应用程序项目中的单个 main.cpp 文件进行编译和工作:

#include <QCoreApplication>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QByteArray>
#include <QString>

#include <QDebug>

//# webservice.h
class WebService:public QObject
{
Q_OBJECT

public:
explicit WebService(QObject *parent=0);
void getRequest(const QString &urlString);

signals:
void networkError(QNetworkReply::NetworkError ne);
void finished(QNetworkReply*);

public slots:
void parseNetworkResponse(QNetworkReply* finished);

private:
QNetworkAccessManager *netMgr;

public:
QByteArray data;
};

//#webservice.cpp
WebService::WebService(QObject *parent):QObject(parent)
{
netMgr = new QNetworkAccessManager;

connect(netMgr, SIGNAL(finished(QNetworkReply*)),
this, SLOT(parseNetworkResponse(QNetworkReply*)));
}

void WebService::getRequest(const QString &urlString)
{
QUrl url(urlString);
QNetworkRequest req(url);
emit finished(netMgr->get(req));
}

void WebService::parseNetworkResponse(QNetworkReply *finished)
{
if (finished->error() != QNetworkReply::NoError)
{
qDebug() << "QNetworkReply error: " << finished->error();
emit networkError(finished->error());
return;
}

data = finished->readAll();

qDebug() << data;
}

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

WebService web;
web.getRequest("http://www.google.com");

return a.exec();
}

#include "main.moc"

所做的小修改:

  • 添加了必要的标题
  • 添加了一个调用 WebService::getRequest()main() 和一个适当的 URL
  • #include "main.moc" 添加到main.cpp 文件的末尾,这样qmake 就可以将其正确地“moc-ify”为一个单独的、自包含.cpp文件
  • 在问题的答案中进行了上述修复
  • 在错误情况下添加了一个qDebug()输出

需要做的最后一件事是在项目的 .pro 文件中添加 QT += network,以便将 Qt 网络模块添加到链接步骤和标题搜索路径.


2013 年 10 月 15 日更新

根据您的评论,您似乎希望 QNetworkAccessManager::get() 调用是同步的。我已经添加了另一个版本的示例程序,它将在 WebService::getRequest() 中阻塞,直到收到请求的 finished 信号。请注意,此示例在错误处理方面执行不多,如果网络请求未能及时完成,则可能执行得非常糟糕。适本地处理错误和超时对于示例或研究代码以外的任何事情都是必要的。

此示例的基本思想是异步 Qt 网络模型中发出的信号由框架的事件循环驱动。因此,当发出请求时,将创建一个新的“嵌套”事件循环,并且 WebService::getRequest() 函数会执行该循环(并停留在那里)直到 的处理程序完成 信号告诉事件循环退出。

#include <QCoreApplication>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QUrl>

#include <QEventLoop>

#include <QByteArray>
#include <QString>

#include <QDebug>

//# webservice.h


class WebService:public QObject
{
Q_OBJECT

public:
explicit WebService(QObject *parent=0);
void getRequest(const QString &urlString);

signals:
void networkError(QNetworkReply::NetworkError ne);
//void finished(QNetworkReply*);

public slots:
void parseNetworkResponse(QNetworkReply* finished);

private:
QNetworkAccessManager *netMgr;
QEventLoop request_event_loop;

public:
QByteArray data;
};

//#webservice.cpp
WebService::WebService(QObject *parent):QObject(parent)
{
netMgr = new QNetworkAccessManager;

connect(netMgr, SIGNAL(finished(QNetworkReply*)),
this, SLOT(parseNetworkResponse(QNetworkReply*)));
}

void WebService::getRequest(const QString &urlString)
{
QUrl url(urlString);
QNetworkRequest req(url);
netMgr->get(req);

request_event_loop.exec(); // wait here until the WebService::parseNetworkResponse() slot runs
// emit finished(netMgr->get(req));
}

void WebService::parseNetworkResponse(QNetworkReply *finished)
{
qDebug() << "enter parseNetworkResponse()";

if (finished->error() != QNetworkReply::NoError)
{
qDebug() << "QNetworkReply error: " << finished->error();
emit networkError(finished->error());
}
else {
data = finished->readAll();

qDebug() << data;
}

qDebug() << "request_event_loop.exit()";
request_event_loop.exit();
qDebug() << "exit parseNetworkResponse()";
}

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

WebService web;

qDebug() << "main() getRequest()";
web.getRequest("http://www.stackoverflow.com");
qDebug() << "main() getRequest() completed";

return a.exec();
}

#include "main.moc"

关于c++ - 为什么这个 Qt 信号永远不会发出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com