Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Qt] Problema con QNetworkRequest

    ciao!

    ho un problema con QNetworkRequest.
    questo il codice:
    codice:
    Service::Service()
    {
        qDebug() << "started" << endl;
        QNetworkRequest request(QUrl("........."));
        qDebug() << "requested" << endl;
        QNetworkAccessManager manager;
        QNetworkReply* reply = manager.get(request);
        qDebug() << "get" << endl;
        if (reply->error())
        {
            qDebug() << "ERROR!";
            qDebug() << reply->errorString();
        }
        else
        {
            qDebug() << "content" << endl;
            qDebug() << reply->header(QNetworkRequest::ContentTypeHeader).toString();
            qDebug() << "last" << endl;
            qDebug() << reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toString();
            qDebug() << "length" << endl;
            qDebug() << reply->header(QNetworkRequest::ContentLengthHeader).toULongLong();
            qDebug() << "status" << endl;
            qDebug() << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        }
        qDebug() << "finished" << endl;
    }
    la risposta è questa:
    codice:
     started 
      requested 
    
      get 
    
      content 
    
      ""
    
     last 
    
      ""
    
     length 
    
      0
    
     status 
    
      0
    
     finished 
    in sostanza mi escono solo i valori messi a mano, ma non ho risultati.
    il servizio mi dovrebbe restituire una stringa json (che parserei in seguito).
    l'url è corretto perchè testato sul browser, e cmq non cado nell'if dell'errore.
    dove sto sbagliando??

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Non mi è mai capitato di usare QNetworkRequest & C. , ma non è che la get non è stata ancora completata quando stampi i risultati (è asincrona)?

    Potresti fare un loop in attesa che reply->isFinished() sia true, oppure connettere il segnale finished ad uno slot dove poi utilizzi i dati

  3. #3
    http://stackoverflow.com/questions/5...t-for-finished
    Nota comunque che l'event loop che piazzi fa ripartire la gestione degli eventi in attesa che sia terminata la richiesta, per cui se sei nel thread della GUI potresti ritrovarti chiamate ricorsive al tuo slot.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    http://stackoverflow.com/questions/5...t-for-finished
    Nota comunque che l'event loop che piazzi fa ripartire la gestione degli eventi in attesa che sia terminata la richiesta, per cui se sei nel thread della GUI potresti ritrovarti chiamate ricorsive al tuo slot.
    ciao!

    ho provato con questo codice seguendo l'esempio:
    codice:
    void MainWindow::on_pushButton_clicked()
    {
        QUrl url("...............................................");
    
        QNetworkAccessManager *manager = new QNetworkAccessManager(this);
        QNetworkRequest netRequest(url);
        QNetworkReply *netReply = manager->get(netRequest);
        QEventLoop loop;
        connect(netReply, SIGNAL(finished()), &loop, SLOT(quit()));
        loop.exec();
    
        qDebug() << netReply->readAll();
    }
    l'ho legato al click di un button.
    in effetti questo funziona, in console mi esce la stringa json corretta.

    per quanto riguarda la tua nota, cosa mi consiglieresti??

  5. #5
    Puoi disabilitare l'interfaccia mentre è in corso la richiesta (e magari impostare il cursore alla clessidra).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Puoi disabilitare l'interfaccia mentre è in corso la richiesta (e magari impostare il cursore alla clessidra).
    ciao!

    alla fine seguendo diversi tutorial ho fatto questo:
    codice:
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        wsUrl = "http://www.hardstyleitalia.com/blog/api/get_posts/";
        progressDialog = new QProgressDialog(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_btnService_clicked()
    {
        progressDialog->setVisible(true);
        manager = new QNetworkAccessManager(this);
        url = wsUrl;
        progressDialog->setWindowTitle(tr("Loading..."));
        //progressDialog->setLabelText(tr("Downloading %1.").arg("TEST"));
        startRequest(url);
    }
    
    void MainWindow::httpReadyRead()
    {
        qDebug() << reply->readAll();
    }
    
    void MainWindow::startRequest(QUrl url)
    {
        reply = manager->get(QNetworkRequest(url));
        connect(reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead()));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(updateProgress(qint64, qint64)));
        connect(reply, SIGNAL(finished()), this, SLOT(httpDownloadFinished()));
    }
    
    void MainWindow::httpDownloadFinished()
    {
        progressDialog->hide();
        reply->deleteLater();
        reply->close();
        manager = 0;
    }
    
    void MainWindow::updateProgress(qint64 bytesRead, qint64 totalBytes)
    {
        progressDialog->setMaximum(totalBytes);
        progressDialog->setValue(bytesRead);
    }
    funziona abbastanza bene, a parte la progress dialog.
    nel senso che si avvia e si chiude.
    ma passa dallo 0 al 100% tutto insieme.
    quindi in sostanza non c'è un "progress".
    da cosa potrebbe dipendere??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.