Qt NetworkAccessManager завершил сигнал

0

У меня есть код, который будет загружать пакет из Интернета. Я хочу, чтобы такой код запускал html5viewer (или окно, это будет одно и то же) после завершения загрузки, то есть я должен обработать законченный() сигнал, вот мой код:

main.cpp

#include <QApplication>
#include "html5applicationviewer.h"
#include "networkmanager.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    NetworkManager manager;

    //manager.setFile("http://listadomedicamentos.aemps.gob.es/prescripcion.zip");
    manager.setFile("http://listadomedicamentos.aemps.gob.es/prescripcion.zip");
/*
    Html5ApplicationViewer viewer;

    viewer.setOrientation(Html5ApplicationViewer::ScreenOrientationAuto);
    viewer.showMaximized();
    viewer.loadFile(QLatin1String("html/index.html"));*/

    return app.exec();
}

networkmanager.h

#include <QObject>
#include "html5applicationviewer.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QFile>
#include <QStringList>

class NetworkManager : public QObject
{
    Q_OBJECT
public:
    explicit NetworkManager(QObject *parent = 0);
    virtual ~NetworkManager();
    void setFile(QString fileURL);

private:
    QNetworkAccessManager *manager;
    QNetworkReply *reply;
    QFile *file;

private slots:
    void onDownloadProgress(qint64, qint64);
    void onFinished(QNetworkReply *reply);
    void onReadyRead();
    void onReplyFinished();
};

networkmanager.cpp

#include "networkmanager.h"
#include "html5applicationviewer.h"
#include <QDir>
#include <QStandardPaths>
#include <QDebug>

NetworkManager::NetworkManager(QObject *parent) :
    QObject(parent)
{
    manager = new QNetworkAccessManager;
}

NetworkManager::~NetworkManager()
{
    manager->deleteLater();
}

void NetworkManager::setFile(QString fileURL)
{
    QString filePath = fileURL;
    QString saveFilePath;
    QString savePath;

    QStringList filePathList = filePath.split('/');
    QString fileName = filePathList.at(filePathList.count() - 1);

    savePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation);

    if (QDir(savePath).exists())
    {
        qDebug() << "Archivos locales para almacenar la base de datos existentes.";
    }
    else
    {
        qDebug() << "Creando los archivos locales para almacenar la base de datos...";
        QDir().mkdir(savePath);
    }

    saveFilePath = QString(savePath + "/" + fileName );

    QNetworkRequest request;
    request.setUrl(QUrl(fileURL));
    reply = manager->get(request);

    file = new QFile;
    file->setFileName(saveFilePath);
    file->open(QIODevice::WriteOnly);

    connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this,
            SLOT(onDownloadProgress(qint64,qint64)));
    connect(manager, SIGNAL(finished(QNetworkReply*)), this,
            SLOT(onFinished(QNetworkReply*)));
    connect(reply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished()));
}

void NetworkManager::onDownloadProgress(qint64 bytesRead, qint64 bytesTotal)
{
    qDebug() << QString::number(bytesRead).toLatin1() + " bytes descargados de " +
                QString::number(bytesTotal).toLatin1() + " bytes totales";
}

void NetworkManager::onFinished(QNetworkReply *reply)
{
    switch (reply->error())
    {
    case QNetworkReply::NoError:
    {
        qDebug() << "El archivo se ha descargado con éxito.";
    }
        break;

    default:
        qDebug() << reply->errorString().toLatin1();
    }

    if (file->isOpen())
    {
        file->close();
        file->deleteLater();
    }
}

void NetworkManager::onReadyRead()
{
    file->write(reply->readAll());
}

void NetworkManager::onReplyFinished()
{
    if (file->isOpen())
    {
        file->close();
        file->deleteLater();
    }
}

Я пробовал делать

connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished(Html5ApplicationViewer&)));
void NetworkManager::onReplyFinished(Html5ApplicationViewer &viewer)
{
    viewer.show();
    if (file->isOpen())
    {
        file->close();
        file->deleteLater();
    }
}

Но он скажет мне, что:

QObject::connect: Incompatible sender/receiver arguments
        QNetworkReplyHttpImpl::finished() --> NetworkManager::startViewer(Html5ApplicationViewer&)

Как я могу запустить этот просмотрщик или окно с помощью этого завершенного() сигнала?

Теги:
qt

1 ответ

1
Лучший ответ

Вы столкнулись с проблемой, потому что готовый сигнал QNetworkAccessManager не имеет никаких параметров, пока вы подключаете его к слоту, который принимает параметр Html5ApplicationViewer в качестве параметра.

который несовместим и, таким образом, вы получаете предупреждение.

Если вы хотите получить доступ к указателю Html5ApplicationViewer, вам нужно будет назначить или создать указатель внутри вашего класса NetworkManager.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню