Qt/C++ を使用して Web から画像をダウンロードするアプリケーションを作成しようとしています。プログラムは URL のリストをテキスト ファイルとして提供し、各 URL を開いて各 Web サイトのすべての画像をダウンロードする必要があります。
そのために、QNetworkAccessManager をサブクラス化し、createRequest
以下のようにメソッド/関数をオーバーライドします。
QNetworkReply* clsNAM::createRequest(Operation op,const QNetworkRequest & req,
QIODevice * outgoingData )
{
return new clsNR(QNetworkAccessManager::createRequest(_op,_req,_outgoingData));
}
私の QNetworkReply クラスのサブクラスである clsNR は、生のヘッダーから応答のタイプを次のように識別します。
bool clsNR::isImage()
{
if(this->rawHeader("Content-Type").toLower().startsWith("image"))
return true;
else
return false;
}
readyRead シグナルを取得すると (つまり、読み取り可能なデータがあることを意味します)、受信したシグナルを QbyteArray に格納します。QNetworkReply が終了したときにイメージを保存するために、clsNR にスロットを接続しました。次のようになります。
void clsNR::slotCloseConnection()
{
if(isImage())
{
QImage image;
bool bool1 = image.loadFromData(ContentData);
QString name(QDir::homePath());
name.append(this->url().path());
bool bool2 = image.save(name,0,-1);
}
}
私の節約には何か問題があります。bool1
ですがtrue
、_ 名前に URL パスを使用している理由は、画像に一意の名前を生成するためです。名前を印刷すると、次のようになります。bool2
false
"/home/guest/images/splash/3.jpg"
私の質問は次のとおりです。
- QImageで何が間違っていますか?
- 代わりに QFile と QStream を使用して画像を書き留めることはできますか?