1

サーバーから QT プログラムにページをダウンロードしようとしていますが、それを行う方法を探していましたが、あまりうまくいきません。私は QT/C++ の専門家ではないので、親切に教えてください :)

まあ..これまでのところ、私はこのコードを持っています:

[古いコード] - 以下の更新されたコードを確認してください。

http.cpp

#include "http.h"

http::http(QObject *parent) :
    QObject(parent)
{

    qDebug() << "HTTP ST";

    http1 = new QHttp(this);
    connect(http1, SIGNAL(done(bool)), this, SLOT(httpdown())); // Correction 1.
    http1->setHost("localhost");
    http1->get("/test.php");

    qDebug() << "HTTP END";


}

void http::httpdown()
{

    qDebug() << "completed!";
    qDebug() << http1->readAll();


}

http.h

#ifndef HTTP_H
#define HTTP_H

#include <QtNetwork>
#include <QHttp>
#include <QDebug>
#include <QObject>

class http : public QObject
{
    Q_OBJECT
public:
    explicit http(QObject *parent = 0);

signals:

public slots:
    void httpdown();

private:
    QHttp *http1;

};

#endif // HTTP_H

問題は、httpdown() が呼び出されないことです。私が知っていることは何でも試しました :( おそらく、これを正しく行っていません。

助けていただければ幸いです。ありがとう。


質問の更新

alexisdmの提案を聞いて、QNetworkAccessManager を確認しました。したがって、これは main() で正しく動作する新しいコードです。

別のクラスから実行すると、シグナルが表示されません。

【新コード】

http2.cpp

#include "http2.h"

http2::http2(QObject *parent) :
    QObject(parent)
{
    m_manager = new QNetworkAccessManager(this);
    connect(m_manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(httpdown(QNetworkReply*)));

    QNetworkRequest request;
    request.setUrl(QUrl("http://localhost/test.php"));
    request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

    m_manager->get(request);
}

void http2::httpdown(QNetworkReply* result)
{

       QByteArray data= result->readAll();
       QString str(data);

       qDebug() <<  str;

}

http2.h

#ifndef HTTP2_H
#define HTTP2_H

#include <QObject>
#include <QDebug>
#include <QtNetwork>
#include <QNetworkReply>

class http2 : public QObject
{
    Q_OBJECT
public:
    explicit http2(QObject *parent = 0);

signals:

public slots:
    void httpdown(QNetworkReply* result);
private:
    QNetworkAccessManager* m_manager;

};

#endif // HTTP2_H

今、次のように main.cpp の下で直接呼び出すと:

main.cpp

#include <QtCore/QCoreApplication>
#include "tcpserver.h"
#include "http2.h"

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

    http2 h; // --> Working!!

    tcpserver mServer;

    return a.exec();
}

それは正常に動作します。ただし、次のように tcpserver クラス内で呼び出すと:

tcpserver.cpp

#include "tcpserver.h"
#include "protocol.h"
#include "http2.h"

QTextStream in(stdin);

tcpserver::tcpserver(QObject *parent) :
    QObject(parent)
{
    server = new QTcpServer(this);

    [ ... Other Server Stuff ... ]

    // http2 h; // --> OLD CODE - Not Working :(

    http2 *h = new http2(this); // **--> NEW CODE working provided by alexisdm**

}

信号がまったく発生しません...何が問題なのですか? 私はここに新しいです!:P

とにかく、alexisdm次のように述べています。クラスの問題(回答へのリンク)

それを避けるために私は何をすべきですか?

ありがとう!;)

4

2 に答える 2

1

orオブジェクトはローカルに割り当てられるため、コンストラクターの最後で破棄されますhttphttp2

少なくとも動的に割り当てる必要があります。

http2 *h = new http2(this);

再利用したい場合はtcpserver、ローカル変数を使用する代わりに、のメンバーとして宣言することもできます。そうでない場合は、不要になったときに何らかの方法で破棄する必要があります。


編集

  • 破棄がスロット内で行われた場合、および/または からのシグナルに応答して破棄された場合は、オブジェクトがシグナルの発信時にまだどこかで参照されている可能性があるため、即時削除ではなくh使用する必要があります。したがって、スロット内またはスロット内のいずれかです。QObject::deleteLater
    deleteLater();httpdown()h->deleteLater();tcpserver

  • 回答またはエラーがあるかどうかを知るには、そのコードtcpserverを使用して、カスタム シグナルとスロットを使用してデータまたはエラーをクラスに転送できます。

于 2011-08-25T17:43:56.997 に答える
1

この線:

SIGNAL(bool)

本当に正しくありません。もしかして

SIGNAL(done(bool))

?

デバッグ モードでは、信号を接続できなかったというデバッグ出力が表示されるはずです。

于 2011-08-25T14:25:39.480 に答える