У меня есть этот скрипт QT с использованием WebKit. Я могу загрузить файлы без проблем, но я не могу заставить индикатор выполнения двигаться в диалоговом окне файлов. Я думаю, что сетевой ответ уже был отправлен до того, как я вызову диалоговое окно прогресса, так как задержка нажатия на ссылку для загрузки, а затем qDebug() << "Left click - download!";
эхо в консоли. Как перехватить ответ netwrok до его завершения и вызова метода unsupportedContent ()?
РЕДАКТИРОВАТЬ:
Я мог бы раздеть это и использовать reply = manager.get(QNetworkRequest(url));
но на самом деле я не знаю URL, это может быть любая ссылка, по которой щелкает пользователь, нет предопределенного URL?
void MainWindow::unsupportedContent(QNetworkReply *reply) {
qDebug() << "Left click - download!";
qDebug() << "Bytes to download: " << reply->bytesAvailable();
QString str = reply->rawHeader("Content-Disposition");
QString end = str.mid(21);
end.chop(1);
qDebug() << "File name: " << end;
qDebug() << "File type: " << reply->rawHeader("Content-Type");
qDebug() << "File size (bytes): " << reply->bytesAvailable();
QString defaultFileName = QFileInfo(end).fileName();
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), defaultFileName);
if (fileName.isEmpty()) return;
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
QMessageBox::information(this, "Downloader",
tr("Unable to save the file %1: %2.")
.arg(fileName).arg(file->errorString()));
delete file;
file = NULL;
return;
}
downloadRequestAborted = false;
connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished()));
connect(reply, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));
connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));
//downloadButton->setEnabled(false);
progressDialog->exec();//QFile file(fileName);
//file.open( QIODevice::WriteOnly );
//file.write(reply->read(reply->bytesAvailable()));
//file.close();
}
void MainWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
{
qDebug() << bytesReceived << bytesTotal;
if(downloadRequestAborted)
return;
progressDialog->setMaximum(bytesTotal);
progressDialog->setValue(bytesReceived);
}
void MainWindow::downloadReadyRead()
{
if(file)
file->write(reply->read(reply->bytesAvailable()));
}
void MainWindow::downloadFinished()
{
qDebug() << "Download finished!";
if(downloadRequestAborted)
{
if(file)
{
file->close();
file->remove();
delete file;
file = NULL;
}
reply->deleteLater();
progressDialog->hide();
//downloadButton->setEnabled(true);
return;
}
downloadReadyRead();
progressDialog->hide();
//downloadButton->setEnabled(true);
file->flush();
file->close();
if(reply->error())
{
//Download failed
QMessageBox::information(this, "Download failed", tr("Failed: %1").arg(reply->errorString()));
}
reply->deleteLater();
reply = NULL;
delete file;
file = NULL;
}
void MainWindow::cancelDownload()
{
downloadRequestAborted = true;
reply->abort();
progressDialog->hide();
//downloadButton->setEnabled(true);
}
Описанный выше метод работал все время, когда проблема была в том, что получаемые им байты были такими маленькими, что вы даже не могли сказать, что они были загружены, как только я попытался загрузить больший файл, загружаемые байты были адекватно отображены 🙂
Вот метод, которым я закончил, который мог получить запрос и сохранить его на диск.
void MainWindow::unsupportedContent(QNetworkReply *reply) {
QString str = reply->rawHeader("Content-Disposition");
QString end = str.mid(21);
end.chop(1);
QString defaultFileName = QFileInfo(end).fileName();
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), defaultFileName);
if (fileName.isEmpty()) return;
file = new QFile(fileName);
if(!file->open(QIODevice::WriteOnly))
{
QMessageBox::information(this, "Downloader",
tr("Unable to save the file %1: %2.")
.arg(fileName).arg(file->errorString()));
delete file;
file = NULL;
return;
}
downloadRequestAborted = false;
if(!reply->isFinished()){
connect(reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(downloadProgress(qint64, qint64)));
connect(progressDialog, SIGNAL(canceled()), SLOT(cancelDownload()));
progressDialog->setLabelText(tr("Downloading %1...").arg(fileName));
progressDialog->exec();
//return;
}
if(downloadRequestAborted)
{
if(file)
{
file->close();
file->remove();
delete file;
file = NULL;
}
reply->abort();
reply->deleteLater();
progressDialog->hide();
return;
}
file->write(reply->read(reply->bytesAvailable()));
file->flush();
file->close();
file = NULL;
if(file == NULL){
isDownload = true;
fileURL = fileName;
systray->showMessage("CytoViewer v1.0", "Download finished - Click to open", QSystemTrayIcon::NoIcon, 10000);
}
}
Других решений пока нет …