QT Connect QNetworkReply SIGNAL 完成()未触发
QT Connect QNetworkReply SIGNAL finished() not firing
我看过这个link and except the signal spy and debugging i tried at least everything. I took the example from this site。我现在还没有设置调试器。
我的问题是我想触发一个自定义插槽,但没有任何反应。
我尝试了 qmake 并重建了项目,但结果是一样的。
我在 Windows10 机器上使用带有 QT 5.7 msvc2015_64 作为工具包的 QTCreator。
我没有收到任何应该用于测试功能的未引用警告(*未使用回复)。这个问题的根源可能是什么?
我的完成信号有问题吗?
根据程序的流程,我假设它是这样的:
我创建了一个指向名为 manager 的 class QNetworkAccessManager
实例的新指针。
然后,我将管理器对象的信号 finished
连接到对象管理器的自定义插槽 test(QNetworkReply*)
。
现在,每次发出来自对象管理器的信号 finished
时,都应该执行来自对象管理器的函数 test
。
从文档 QNetworReply *QNetworkAccessManager::get(QNetworkRequest(QUrl))
中,我假设调用此函数时会返回一个新的 QNetworkReply*
对象,并且当此对象完成处理时会发出 finished
信号。我必须以其他方式连接我的信号和插槽吗?
我试图声明QNetworkReply reply* = manager->get....
和 connect(reply, SIGNAL(finished()),this,SLOT(test()));
但我的应用程序在这里崩溃了。
当我设置 wireshark 和过滤器时:http 包含“http://www.theuselessweb.com”,没有弹出任何内容。
switchwebpanel.h
#ifndef SWITCHWEBPANEL_H
#define SWITCHWEBPANEL_H
#include <QNetworkAccessManager>
#include <QObject>
#include <QUrl>
#include <QNetworkReply>
#include <QFile>
#include <QDateTime>
#include <QNetworkRequest>
#include <QDebug>
class switch_panel : public QObject
{
Q_OBJECT
public:
switch_panel(QObject *parent = 0);
void doDownload();
signals:
public slots:
void replyFinished(QNetworkReply *reply);
void test(QNetworkReply * reply);
private:
QNetworkAccessManager *manager;
};
#endif // SWITCHWEBPANEL_H
switchwebpanel.cpp
#include <switchwebpanel.h>
switch_panel::switch_panel(QObject *parent):
QObject(parent)
{}
void switch_panel::doDownload(){
qDebug()<<"Downloader gestartet";
manager = new QNetworkAccessManager (this);
qDebug()<<"connect...";
// Here i want to call the test(QNetworkReply*) function
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(test(QNetworkReply*)));
qDebug()<<"get";
manager->get(QNetworkRequest(QUrl("http://www.theuselessweb.com")));
qDebug()<<"manager gegeted";
}
void switch_panel::replyFinished(QNetworkReply *reply){
qDebug()<<"Async starten";
if(reply->error()){
qDebug()<<"error";
qDebug()<<reply->errorString();
}
else {
qDebug()<<reply->header(QNetworkRequest::ContentTypeHeader).toString();
qDebug()<<reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString();
qDebug()<<reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
qDebug()<<"File";
QFile *file = new QFile("./htmlpanel.txt");
if(file->open(QFile::Append)){
file->write(reply->readAll());
file->flush();
file->close();
}
//delete file;
}
reply->deleteLater();
qDebug()<<"Async fertig";
}
void switch_panel::test(QNetworkReply *reply){
qDebug()<<"test";
}
我得到以下输出:
Download
Downloader gestartet
connect...
get
manager gegeted
我的 Main.cpp 电话:switch_panel panel; panel.doDownload();
Qt 的网络管理器需要一个到 运行 的事件循环来处理异步网络访问。最简单的方法是在 main 中创建一个 QCoreApplication
对象并调用它的 exec()
方法:
#include <QCoreApplication>
#include "switchwebpanel.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
switch_panel p;
p.doDownload();
return a.exec();
}
我看过这个link and except the signal spy and debugging i tried at least everything. I took the example from this site。我现在还没有设置调试器。
我的问题是我想触发一个自定义插槽,但没有任何反应。
我尝试了 qmake 并重建了项目,但结果是一样的。
我在 Windows10 机器上使用带有 QT 5.7 msvc2015_64 作为工具包的 QTCreator。
我没有收到任何应该用于测试功能的未引用警告(*未使用回复)。这个问题的根源可能是什么?
我的完成信号有问题吗?
根据程序的流程,我假设它是这样的:
我创建了一个指向名为 manager 的 class QNetworkAccessManager
实例的新指针。
然后,我将管理器对象的信号 finished
连接到对象管理器的自定义插槽 test(QNetworkReply*)
。
现在,每次发出来自对象管理器的信号 finished
时,都应该执行来自对象管理器的函数 test
。
从文档 QNetworReply *QNetworkAccessManager::get(QNetworkRequest(QUrl))
中,我假设调用此函数时会返回一个新的 QNetworkReply*
对象,并且当此对象完成处理时会发出 finished
信号。我必须以其他方式连接我的信号和插槽吗?
我试图声明QNetworkReply reply* = manager->get....
和 connect(reply, SIGNAL(finished()),this,SLOT(test()));
但我的应用程序在这里崩溃了。
当我设置 wireshark 和过滤器时:http 包含“http://www.theuselessweb.com”,没有弹出任何内容。
switchwebpanel.h
#ifndef SWITCHWEBPANEL_H
#define SWITCHWEBPANEL_H
#include <QNetworkAccessManager>
#include <QObject>
#include <QUrl>
#include <QNetworkReply>
#include <QFile>
#include <QDateTime>
#include <QNetworkRequest>
#include <QDebug>
class switch_panel : public QObject
{
Q_OBJECT
public:
switch_panel(QObject *parent = 0);
void doDownload();
signals:
public slots:
void replyFinished(QNetworkReply *reply);
void test(QNetworkReply * reply);
private:
QNetworkAccessManager *manager;
};
#endif // SWITCHWEBPANEL_H
switchwebpanel.cpp
#include <switchwebpanel.h>
switch_panel::switch_panel(QObject *parent):
QObject(parent)
{}
void switch_panel::doDownload(){
qDebug()<<"Downloader gestartet";
manager = new QNetworkAccessManager (this);
qDebug()<<"connect...";
// Here i want to call the test(QNetworkReply*) function
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(test(QNetworkReply*)));
qDebug()<<"get";
manager->get(QNetworkRequest(QUrl("http://www.theuselessweb.com")));
qDebug()<<"manager gegeted";
}
void switch_panel::replyFinished(QNetworkReply *reply){
qDebug()<<"Async starten";
if(reply->error()){
qDebug()<<"error";
qDebug()<<reply->errorString();
}
else {
qDebug()<<reply->header(QNetworkRequest::ContentTypeHeader).toString();
qDebug()<<reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString();
qDebug()<<reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
qDebug()<<"File";
QFile *file = new QFile("./htmlpanel.txt");
if(file->open(QFile::Append)){
file->write(reply->readAll());
file->flush();
file->close();
}
//delete file;
}
reply->deleteLater();
qDebug()<<"Async fertig";
}
void switch_panel::test(QNetworkReply *reply){
qDebug()<<"test";
}
我得到以下输出:
Download
Downloader gestartet
connect...
get
manager gegeted
我的 Main.cpp 电话:switch_panel panel; panel.doDownload();
Qt 的网络管理器需要一个到 运行 的事件循环来处理异步网络访问。最简单的方法是在 main 中创建一个 QCoreApplication
对象并调用它的 exec()
方法:
#include <QCoreApplication>
#include "switchwebpanel.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
switch_panel p;
p.doDownload();
return a.exec();
}