c++qtqurl

No member named 'addQueryItem' in 'QUrl' - Convert Qt 4.7 to 5.8


I need to convert Qt legacy code from 4.7 to 5.8, I have a compilation error in Qt Creator 4.2.1 Clang 7.0(Apple) 64bit.

Looking in .cpp file

QList<QByteArray> priceGetterTSP::downloadFile(const QString &symbol_, int beginDate_, int endDate_)
{
   QNetworkAccessManager manager;
   QEventLoop loop;
   QNetworkRequest request(QUrl("http://www.fedsmith.com/tsp/csv.dailyfund.db.php"));
   QByteArray data;
   QUrl params;
   QDate beginQDate = QDate::fromJulianDay(beginDate_);
   QDate endQDate = QDate::fromJulianDay(endDate_);

QString properCaseSymbol = symbol_.left(3).append(symbol_.right(symbol_.length() - 3).toLower());
  params.addQueryItem("fund", properCaseSymbol);
  params.addQueryItem("frommonth", QString::number(beginQDate.month()));
  params.addQueryItem("fromday", QString::number(beginQDate.day()));
  params.addQueryItem("fromyear", QString::number(beginQDate.year()));
  params.addQueryItem("tomonth", QString::number(endQDate.month()));
  params.addQueryItem("today", QString::number(endQDate.day()));
  params.addQueryItem("toyear", QString::number(endQDate.year()));
  data.append(params.toString());
  data.remove(0,1);

QNetworkReply *reply = manager.post(request, data);
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

loop.exec();

QList<QByteArray> lines;
if (reply->error() == QNetworkReply::NoError)
    lines = reply->readAll().split('\n');

delete reply;
return lines;
}

Looking at the Top of the .cpp

#include "priceGetterTSP.h"

#include <QString>
#include <QList>
#include <QByteArray>
#include <QUrl>
#include <QDate>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <historicalPrices.h>

ERROR in .cpp

../src/prices/priceGetterTSP.cpp:86:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("fund", properCaseSymbol); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:87:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("frommonth", QString::number(beginQDate.month())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:88:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("fromday", QString::number(beginQDate.day())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:89:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("fromyear", QString::number(beginQDate.year())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:90:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("tomonth", QString::number(endQDate.month())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:91:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("today", QString::number(endQDate.day())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:92:12: error: no member named 'addQueryItem' in 'QUrl' params.addQueryItem("toyear", QString::number(endQDate.year())); ~~~~~~ ^ 7 errors generated. make: *** [priceGetterTSP.o] Error 1 16:40:22: The process "/usr/bin/make" exited with code 2. Error while building/deploying project mypersonalindex (kit: Desktop Qt 5.8.0 clang 64bit)

OK ... so what is the replacement?

What's the missing #include < >?


Solution

  • Instead of calling addQueryItem on a QUrl object, you create a QUrlQuery object and make the calls on that. Then you set the finished query on the url

    QUrlQuery paramsQuery;
    paramsQuery.addQueryItem("fund", properCaseSymbol);
    // and so on..
    
    params.setQuery(paramsQuery);
    

    Since you are not using params as an URL but just as a toString helper, you could even try just changing the type

    QUrlQuery params;
    

    and keeping most of the code the way it is