Нет члена с именем «addQueryItem» в «QUrl» — преобразовать Qt 4.7 в 5.8

Мне нужно преобразовать устаревший код Qt из 4.7 в 5.8, у меня ошибка компиляции в Qt Creator 4.2.1 Clang 7.0 (Apple) 64bit.

Ищем файл .cpp

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;
}

Вверху файла .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>

ОШИБКА в .cpp

../src/prices/priceGetterTSP.cpp:86:12: ошибка: нет члена с именем addQueryItem в QUrl params.addQueryItem("fund", propperCaseSymbol); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:87:12: ошибка: нет члена с именем 'addQueryItem' в 'QUrl' params.addQueryItem("frommonth", QString ::число(beginQDate.month())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:88:12: ошибка: нет члена с именем addQueryItem в QUrl params.addQueryItem("fromday", QString::number(beginQDate.day ())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:89:12: ошибка: нет члена с именем addQueryItem в QUrl params.addQueryItem("fromyear", QString::number(beginQDate.year ())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:90:12: ошибка: нет члена с именем addQueryItem в QUrl params.addQueryItem("tomonth", QString::number(endQDate.month ())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:91:12: ошибка: нет участника с именем addQueryItem в QUrl params.addQueryItem("сегодня", QString::number(endQDate.day ())); ~~~~~~ ^ ../src/prices/priceGetterTSP.cpp:92:12: ошибка: нет члена с именем addQueryItem в QUrl params.addQueryItem("toyear", QString::number(endQDate.year ())); ~~~~~~ ^ 7 ошибок. make: *** [priceGetterTSP.o] Ошибка 1 16:40:22: Процесс "/usr/bin/make" завершился с кодом 2. Ошибка при сборке/развертывании проекта mypersonalindex (комплект: Desktop Qt 5.8.0 clang 64bit )

Хорошо... так чем заменить?

Чего не хватает #include ‹ >?


person bullflag    schedule 10.03.2017    source источник
comment
Взгляните на новый класс QUrlQuery.   -  person MrEricSir    schedule 10.03.2017
comment
@MrEricSir Спасибо, Мои навыки C++ довольно ограничены, не видите ли вы каких-нибудь незначительных изменений, которые могли бы преобразовать это из Qt4 в Qt5. Я сомневаюсь, что у меня есть опыт внесения изменений в использование QUrlQuery. Я прочитал в документах: следующие члены класса QUrl устарели. Они предоставляются для поддержания работоспособности старого исходного кода. Мы настоятельно не рекомендуем использовать их в новом коде. Ошибка в (устарело) void addQueryItem(const QString &key, const QString &value)   -  person bullflag    schedule 10.03.2017


Ответы (1)


Вместо вызова addQueryItem для объекта QUrl вы создаете объект QUrlQuery и выполняете вызовы для него. Затем вы устанавливаете готовый запрос на URL

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

params.setQuery(paramsQuery);

Поскольку вы используете params не как URL-адрес, а просто как помощник toString, вы даже можете попробовать просто изменить тип

QUrlQuery params;

и сохраняя большую часть кода таким, какой он есть

person Kevin Krammer    schedule 10.03.2017