1

この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);
}
4

1 に答える 1

0

上記の方法は、受信したバイトが非常に小さく、ダウンロードしたことがまったくわからないという問題が発生している間ずっと機能していました。大きなファイルをダウンロードしようとすると、ダウンロード中のバイトが適切に表示されました:)

これが私が最終的にリクエストを受信して​​ディスクに保存できる方法です。

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);
    }
}
于 2012-12-19T16:53:13.343 に答える