在发布模式下编译时不会发出 QNetworkAccessManager 完成信号(VS 2005)
Posted
技术标签:
【中文标题】在发布模式下编译时不会发出 QNetworkAccessManager 完成信号(VS 2005)【英文标题】:QNetworkAccessManager finished signal is not emitted when compiled in release mode (VS 2005) 【发布时间】:2011-01-25 23:27:44 【问题描述】:我有一个阅读网页的课程。在 Visual Studio 中以 debug 模式构建时按预期工作,但在 release 模式下构建时不起作用。
基本上,QNetworkAccessManager
的完成信号永远不会发出。
我已将代码剥离到最低限度的工作,但它仍然无法正常工作。我尝试在发布模式下使用QtNetworkd4.lib
(与调试模式下的库相同)并禁用优化,但没有效果。
Qt 4.4 版
编辑 这是一些示例代码。
标题:
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QStringList>
class WebReader : public QObject
Q_OBJECT
public:
QStringList *pageData_;
WebReader();
~WebReader();
void fetch(const QString &url);
public slots:
void slotReplyFinished(QNetworkReply *reply);
protected:
QNetworkAccessManager *netManager_;
private:
QNetworkReply *netReply_;
;
Cpp:
WebReader::WebReader()
netManager_ = new QNetworkAccessManager(this);
pageData_ = NULL;
connect(netManager_, SIGNAL(finished(QNetworkReply *)),
this, SLOT(slotReplyFinished(QNetworkReply *)));
WebReader::~WebReader()
// Send a request to read a web page
void WebReader::fetch(const QString &url)
netReply_ = netManager_->get(QNetworkRequest(QUrl(url)));
// SLOT that accepts the read data from the webpage
void WebReader::slotReplyFinished(QNetworkReply *reply)
if (NULL != pageData_)
delete pageData_;
pageData_ = new QStringList(QString(reply->readAll()).split(QString("\n")));
netReply_->deleteLater();
如您所见,它被精简到在调试模式下工作的最低限度。
【问题讨论】:
当我使用 Visual C++ Express 2010 编译器从 Qt Creator 编译时,在发布和调试模式下都适用。 为什么要用旧版Qt(当前是4.7.1)和旧版Visual C++(当前是2010)? @ravil,在问这样的问题之前,您应该查看官方 Qt 错误跟踪器bugreports.qt.nokia.com。例如,像您发布的那样存在未解决的错误:bugreports.qt.nokia.com/browse/QTBUG-5997。 @Johnny 为什么你认为 QTBUG-5997 与这个问题有关? @Piotr,这个问题通常与类似的 Qt 错误之一有关。目前 QNAM 和finished() 信号存在几个活跃的错误。 【参考方案1】:将 libeay32 和 ssleay32 复制到与您的程序相同的文件夹中。
【讨论】:
以上是关于在发布模式下编译时不会发出 QNetworkAccessManager 完成信号(VS 2005)的主要内容,如果未能解决你的问题,请参考以下文章