2014-02-20 5 views
0

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

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&) 

Как я мог бы сделать этот зритель или окно начать с этого законченного (сигнал)?

ответ

1

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

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

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

Смежные вопросы