2015-01-07 64 views
2

我想要使用Qt的網頁並將其打印在屏幕上。問題是它總是打印「」。它不會對完成的SLOT產生影響。我不知道connect()是否有問題。代碼編譯時沒有錯誤。 嘗試不使用事件循環。當試圖使用Qt QNetworkAccessManager獲取網頁時,它總是返回「」

下面的代碼:

net.h

#ifndef NET_H 
 
#define NET_H 
 

 
#include <QObject> 
 
#include <QtNetwork> 
 
#include <QString> 
 
#include <QDebug> 
 

 
class net : public QObject 
 
{ 
 
    Q_OBJECT 
 
public: 
 
    explicit net(QObject *parent = 0); 
 
    void get_site(QString url); 
 
    QString data; 
 

 
signals: 
 

 
public slots: 
 
    void err(QNetworkReply *); 
 
    void done(QNetworkReply *); 
 

 
private: 
 

 
}; 
 

 
#endif // NET_H

net.cpp:

#include "net.h" 
 

 
net::net(QObject *parent) : 
 
    QObject(parent) 
 
{ 
 
} 
 

 
void net::get_site(QString url) { 
 
    QNetworkAccessManager man; 
 
    QNetworkRequest request; 
 

 
    request.setUrl (QUrl(url)); 
 

 
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*))); 
 
    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(err(QNetworkReply *))); 
 

 
    man.get (QNetworkRequest(QUrl(url))); 
 
} 
 

 
void net::done(QNetworkReply * reply) { 
 
    data = QString(reply->readAll()); 
 
} 
 

 
void net::err(QNetworkReply * reply) { 
 
    data = QString(reply->errorString()); 
 
}

而且main.cp電話號碼:

#include <QCoreApplication> 
 
#include "net.h" 
 

 

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

 
    net netobj; 
 
    netobj.get_site("http://stackoverflow.com"); 
 
    qDebug() << netobj.data; 
 
    return a.exec(); 
 
}

+0

那麼,你的問題。沒有讓事件循環完成它的工作,這是不可能的。在你的插槽中放置斷點,看看會發生什麼。 – MrEricSir

+0

但也有一些消息來源沒有使用它。我想他們使用apps退出slot。我不確定。我對Qt很陌生。 – Nve

回答

0

你QNetworkAccessManager實例超出範圍在你get_site函數的末尾。根據Qt文檔,一個QNetworkAccessManager應該足夠用於整個Qt應用程序。你的對象應該持續在該函數的範圍之外,因爲響應可能需要更長的時間才能接收,而不是該函數結束的時間。使QNetworkAccessManager成爲網絡類的成員,而不是本地自動變量get_site

請注意,您還需要管理QNetworkReply對象的生存期,而不是使用delete,而是使用deleteLater(),否則可能會泄漏內存。

+0

謝謝。問題依然存在。也許有辦法等待得到迴應?我不知道爲什麼它會在回覆完成前跳到插槽。或者爲什麼它在回覆獲得內容之前完成! – Nve

+0

如果你抓住並看看錯誤代碼和錯誤字符串Qt返回,它應該告訴你。我會編輯這篇文章來向你展示如何,但Nejat寫了一個新的答案,展示瞭如何。你能發佈你收到的錯誤嗎? – orfdorf

+0

已回答Nejat。沒有錯誤。使用事件循環可以正常工作。所以我想這個問題只是它不等待得到答覆。但我不知道爲什麼。 – Nve

1

您的代碼中存在一些主要問題。首先,你應該有QNetworkAccessManager在.h文件中類成員:

class net : public QObject 
{ 
    ... 
private: 
    QNetworkAccessManager nam; 
}; 

而且你不應該在finished信號連接到兩個不同的插槽。你get_site功能應該是這樣的:

void net::get_site(QString url) { 

    QNetworkRequest request; 
    request.setUrl (QUrl(url)); 

    connect (&man , SIGNAL(finished(QNetworkReply*)) ,this, SLOT(done(QNetworkReply*))); 

    man.get (QNetworkRequest(QUrl(url))); 
} 

而且你應該設法通過以下方式返回的答覆:「儘量不使用事件循環呢。」

void net::done(QNetworkReply * reply) { 


    if (reply->error() == QNetworkReply::NoError) 
    { 
     data = QString(reply->readAll()); 
    } 
    else 
    { 
     data = QString(reply->errorString()); 
    } 
} 
+0

Thanks.But仍然是同樣的問題。似乎我應該等待使用事件循環來獲取響應。我找不出任何其他方式。 – Nve

+0

我不知道爲什麼它會在回覆完成前跳轉到插槽。或者爲什麼在回覆獲得內容之前它完成了! – Nve

+0

發射完成時是否返回錯誤? I.e確實'data = QString(reply-> errorString());'行得到執行? – Nejat

相關問題