Qt World Summit: Register Today!

Code copied from 'http' example has issues

  • When I copied the code from the example into my own project I found that
    #include <QtNetwork> has to be #include <QtNetwork/QtNetwork> and #include <QNetworkAccessManager> has to be #include <QtNetwork/QNetworkAccessManager> the 'connect' method in the http events wants to be derived from a class and I get an error in a file that I will not be ready to understand for ten years some 'meta object thing'

    the header is

    #ifndef GETHTML_H
    #define GETHTML_H
    #include <QProgressDialog>
    #include <QtNetwork/QNetworkAccessManager>
    #include <QUrl>
    #include <memory>
    class gethtml
        QString htmlContent;
        QString errorText;
        QString user;
        QString password;
        bool haslod;
        void downloadFile(QString myurl);
        //QVector<QChar> binContent;
    private slots:
        void startRequest(const QUrl &requestedUrl);
        void httpFinished();
        void httpReadyRead();
        void sslErrors(const QList<QSslError> &errors);
        void slotAuthenticationRequired(QNetworkReply *, QAuthenticator *authenticator);
        QUrl url;
        QNetworkAccessManager qnam;
        QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> reply;
        bool httpRequestAborted = false;
    #endif // GETHTML_H

    the source is

    #include "gethtml.h"
    #include <QtNetwork/QtNetwork>
    #include <QUrl>
    #include <algorithm>
    #include <memory>
    //#if QT_CONFIG(ssl)
    QNetworkAccessManager::connect(&qnam, &QNetworkAccessManager::authenticationRequired,
            this, &gethtml::slotAuthenticationRequired);
    void gethtml::startRequest(const QUrl &requestedUrl)
        url = requestedUrl;
        httpRequestAborted = false;
        //! [qnam-download]
        //! [qnam-download]
        //! [connecting-reply-to-slots]
        connect(reply.get(), &QNetworkReply::finished, this, &gethtml::httpFinished);
        //! [networkreply-readyread-1]
        connect(reply.get(), &QIODevice::readyRead, this, &gethtml::httpReadyRead);
        //! [networkreply-readyread-1]
    #if QT_CONFIG(ssl)
        //! [sslerrors-1]
        connect(reply.get(), &QNetworkReply::sslErrors, this, &gethtml::sslErrors);
        //! [sslerrors-1]
        //! [connecting-reply-to-slots]
    errorText = "";
    haslod = false;
    //    statusLabel->setText(tr("Downloading %1...").arg(url.toString()));
    void gethtml::downloadFile(QString myurl)
        const QString urlSpec = myurl.trimmed();
        if (urlSpec.isEmpty())
        const QUrl newUrl = QUrl::fromUserInput(urlSpec);
        if (!newUrl.isValid()) {
        // schedule the request
    void gethtml::httpFinished()
        //! [networkreply-error-handling-1]
        QNetworkReply::NetworkError error = reply->error();
        const QString &errorString = reply->errorString();
        //! [networkreply-error-handling-1]
        //! [networkreply-error-handling-2]
        if (error != QNetworkReply::NoError) {
            // For "request aborted" we handle the label and button in cancelDownload()
            if (!httpRequestAborted) {
                errorText = reply->error();
        //! [networkreply-error-handling-2]
        //statusLabel->setText(tr("Downloaded %1 bytes to %2\nin\n%3"));
       // if (launchCheckBox->isChecked())
        //    QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absoluteFilePath()));
        haslod = true;
    //! [networkreply-readyread-2]
    void gethtml::httpReadyRead()
        // This slot gets called every time the QNetworkReply has new data.
        // We read all of its new data and write it into the file.
        // That way we use less RAM than when reading it at the finished()
        // signal of the QNetworkReply
            htmlContent += reply->readAll();
    //! [networkreply-readyread-2]
    //! [qnam-auth-required-2]
    void gethtml::slotAuthenticationRequired(QNetworkReply *, QAuthenticator *authenticator)
       // QDialog authenticationDialog;
        //Ui::Dialog ui;
        //ui.siteDescription->setText(tr("%1 at %2").arg(authenticator->realm(), url.host()));
        // Did the URL have information? Fill the UI.
        // This is only relevant if the URL-supplied credentials were wrong
        //if (authenticationDialog.exec() == QDialog::Accepted) {
      //  }
    //! [qnam-auth-required-2]
    //#if QT_CONFIG(ssl)
    //! [sslerrors-2]
    void gethtml::sslErrors(const QList<QSslError> &errors)
        QString errorString = "";
        for (const QSslError &error : errors) {
            if (!errorString.isEmpty())
                errorString += '\n';
            errorString += error.errorString();
        errorText = errorString;
    //! [sslerrors-2]

    I hope someone can help me.

  • Lifetime Qt Champion

    @AI_Messiah said in Code copied from 'http' example has issues:

    When I copied the code from the example into my own project I found that

    You forgot to add the QtNetwork module as described in the documentation and the example also for sure has this line in the .pro-file

    qmake: QT += network

  • Actually I did insert this 'QT += network' in the project file

  • Lifetime Qt Champion

    @AI_Messiah Then the compiler and linker will also use the correct include paths and libs. Don't forget to rerun qmake and you modified the correct pro file.

  • @AI_Messiah said in Code copied from 'http' example has issues:

    and I get an error in a file that I will not be ready to understand for ten years some 'meta object thing'

    After you have followed @Christian-Ehrlicher's instructions to rebuild thoroughly, if you still get this error you should paste it rather than giving us your interpretation! :)

  • I was hoping to see a solution here. I have been working on the https example and for me authentication doesn't seem to work and I know I am accessing a site that needs a log in (MyFitnessPal). The slot never gets called.

  • Lifetime Qt Champion

    @Mr_Ada Don't see what this has to do with your initial issue...

  • @Christian-Ehrlicher Sorry for the late response. I just saw the notification today. I am trying to communicate with MyFitnessPal using HTTP example from QT and the authentication signal never gets triggered. I don't know if it is me or maybe the openssl package I have installed or am using. Seems to not work in Windows or Android. So basically I am saying I did all that was said here but I still cannot communicate with MyFitnessPal. Could be something I am just not missing. I know that MFP uses OAuth and so does Qt so maybe I am not using the right link?

Log in to reply