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