0

GUI アプリで使用するテキスト ファイルを Web からダウンロードしようとしています。最初にイベント ループを使用しましたが、ファイルは最初の試行で 0 バイトのファイルをダウンロードしましたが、それ以降の試行では成功しました (アプリはボタンを使用してダウンロードします)。次に、イベントループなしでクラスメンバー定義のスロットを使用しようとしましたが、スロットが呼び出されません。

イベントループの手順は次のとおりです。

    void class1::downloadFile(const QString &url, const QString &aPathInClient)
    {

        QNetworkAccessManager m_NetworkMngr;
        QNetworkReply *reply= m_NetworkMngr.get(QNetworkRequest(url));
        QEventLoop loop;
        QObject::connect(reply, SIGNAL(finished()),&loop, SLOT(quit()));
        loop.exec();

        QUrl aUrl(url);
        QFileInfo fileInfo=aUrl.path();

        QFile file(aPathInClient+"/"+fileInfo.fileName());
        file.open(QIODevice::WriteOnly);
        file.write(reply->readAll());
        file.close();

        reply->deleteLater();

    }

クラスメンバーで定義されたスロットを使用する手順は次のとおりです。

class1.h

    class class1: public QObject
    {


        Q_OBJECT

        public slots:

            void onRequestCompleted();

        public:

            QString df_url;
            QString df_path;

        public:

            void downloadFile(const QString &url, const QString &aPathInClient);

    };

class1.cpp

    void class1::downloadFile(const QString &url, const QString &aPathInClient)
    {

        df_url = url;
        df_path = aPathInClient;

        QNetworkAccessManager m_NetworkMngr;
        QNetworkReply *reply = m_NetworkMngr.get(QNetworkRequest(url));
        QObject::connect(reply, SIGNAL(finished()), this, SLOT(onRequestCompleted()));

        reply->deleteLater();
    }

    void class1::onRequestCompleted( ) 
    {

        QString url2;
        QString aPathInClient2;

        url2 = df_url;
        aPathInClient2 = df_path;

        QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());

        QUrl aUrl(url2);
        QFileInfo fileInfo=aUrl.path();

        QFile file(aPathInClient2+"/"+fileInfo.fileName());
        file.open(QIODevice::WriteOnly);
        file.write(reply->readAll());
        file.close();
        reply->deleteLater();

    }

変数の冗長性を許してください。私は彼のポイントでそれを機能させようとしているだけです。後できれいにします。この問題に関するヘルプをいただければ幸いです。返信ありがとうございます。

編集:

私はついに問題を見つけました。別の Web サイトからダウンロードしましたが、すべてが機能しています。最初のサイトからの転送に問題があったに違いありません。イベント ループ アプローチを放棄して、クラス メンバー スロット アプローチを使用しています。

私が使用しているコードは次のとおりです。

  //class1.h

    class class1: public QObject
    {

        //There's a lot more to the class, but here are the pertinent parts

        Q_OBJECT

        public slots:

            void onRequestCompleted();

        public:

            QString df_url;
            QString df_path;
            QNetworkAccessManager *m_NetworkMngr;
            QNetworkReply *reply;

        public:

            void downloadFile(const QString &url, const QString &aPathInClient);


    };

 //class1.cpp

    void class1::downloadFile(const QString &url, const QString &aPathInClient)
    {

        df_url = url;    //class variable
        df_path = aPathInClient;   //class variable


        m_NetworkMngr = new QNetworkAccessManager(this); //class variable

        reply= m_NetworkMngr->get(QNetworkRequest(url)); //class variable

        QObject::connect(reply, SIGNAL(finished()), this, SLOT(onRequestCompleted()));


    }


    void class1::onRequestCompleted() {

        QString url2;
        QString aPathInClient2;

        url2 = df_url;
        aPathInClient2 = df_path;


        QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());


        QUrl aUrl(url2);
        QFileInfo fileInfo=aUrl.path();

        QFile file(aPathInClient2+"/"+fileInfo.fileName());
        file.open(QIODevice::WriteOnly);
        file.write(reply->readAll());
        file.close();


    }

downloadFile プロシージャーのパラメーター:

url -string ダウンロードするファイルの URL

aPathInClient - 更新中のファイルを含むフォルダーの文字列の場所

downloadFile は、ボタンを押すことによって呼び出されるプロシージャによって呼び出されます。クラス全体がボタンでインスタンス化され、ボタンのスロットが完了すると破棄されます。したがって、それが発生すると、応答とネットワーク マネージャー オブジェクトが破棄されます。

4

0 に答える 0