2016-09-28 224 views
0

我看了一下link,除了信號間諜和調試,我至少試了一切。我以this site爲例。我現在還沒有設置調試器。QT連接QNetworkReply SIGNAL finished()not firing

我的問題是,我想開一個自定義的插槽,什麼都沒有發生。 我試過qmake並重建項目,但結果是一樣的。 我正在使用QTCreator和QT 5.7 msvc2015_64作爲Windows10機器上的工具包。 我沒有得到應該用於測試功能的任何未引用的警告(*回覆未使用)。什麼可能是這個問題的根源?
我完成的信號有問題嗎?

從程序流程我假設它是以下內容:
我創建了一個新指針,指向名爲manager的類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();

+0

我Main.cpp的呼籲: switch_panel面板; panel.doDownload(); – Eggi

回答

0

的Qt網絡管理員需要運行一個事件循環來處理異步網絡訪問。最簡單的方法是在你的主創建一個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(); 
} 
+0

好吧,我採取了你的建議,並實施了一個事件循環,但以另一種方式: reply = manager-> get(QNetworkRequest(QUrl(「http://www.theuselessweb.com」))); qDebug()<<「connect」; QEventLoop循環; connect(reply,SIGNAL(finished()),&loop,SLOT(quit())); loop.exec(); – Eggi

+0

Qt 5.5會在運行時發出'QEventLoop'不能使用'QApplication'的警告。它可能有效,但你應該在main中創建一個實例。不過,您可以使用本地事件循環來獲取請求。 –

+0

還要注意,調用'loop.exec()'永遠不會返回!您可能希望在您的'switch_panel'類中創建'QEventLoop *',並在完成請求時調用'quit()',以恢復執行'loop.exec()'返回執行 –