Реклама
  • EVILEG
  • Ответ
  • 26 сентября 2017 г. 13:25

Как дождаться выполнения функции

Скачивание происходит в данном случае ассинхронно. Во время цикла Вы запускаете скачивания, создавая все необходимые для скачивания объекты. А потом, когда скачивание заканчивается, то при скачивании каждого файла срабатывает обработчик скачивания файла:

void AppCore::onResult_avatar(QNetworkReply *reply_av)
Это нормальное поведение для QNetworkAccessManager.
Поэтому внедрите счётчик скачиваемых файлов с переменной общего количества файлов, как я посоветовал Вам.
  • alex_lip
  • Ответ
  • 26 сентября 2017 г. 12:23

Как дождаться выполнения функции

Сначала скачивается файл в формате json(это таблица). Затем в процессе разбора этого файла - в цикле скачиваются картинки, которые лежат по адресу указанному в строчках этой таблицы. (url_avatar и url видны внутри всех функций). На данный момент получается что сначала выполняется вся функция

void AppCore::onResult(QNetworkReply *reply)
а затем уже идет скачивание только картинки из последней строчки разобранной парсером таблицы, но скачивается она столько раз, сколько строк в таблице.
void AppCore::onResult_avatar(QNetworkReply *reply_av)
вот лог работы программы

qml: Button Pressed////. Entered text: 
p_SelectAll
"http://192.168.100.38:8088/ords/alex_dba/search/sea/"
f_RUN
22133/-1
Begin OnResult
22133/22133
"C:/Users/Администратор/AppData/Local"
"456218"
"C:/Users/Администратор/AppData/Local/456218av.jpg"
"609884"
"C:/Users/Администратор/AppData/Local/609884av.jpg"
"748259"
"C:/Users/Администратор/AppData/Local/748259av.jpg"
"761634"
"C:/Users/Администратор/AppData/Local/761634av.jpg"
"1143488"
"C:/Users/Администратор/AppData/Local/1143488av.jpg"
"1163417"
"C:/Users/Администратор/AppData/Local/1163417av.jpg"
"1175606"
"C:/Users/Администратор/AppData/Local/1175606av.jpg"
"1213088"
"C:/Users/Администратор/AppData/Local/1213088av.jpg"
"1228058"
"C:/Users/Администратор/AppData/Local/1228058av.jpg"
"1259090"
"C:/Users/Администратор/AppData/Local/1259090av.jpg"
"1324651"
"C:/Users/Администратор/AppData/Local/1324651av.jpg"
"1325363"
"C:/Users/Администратор/AppData/Local/1325363av.jpg"
"1338993"
"C:/Users/Администратор/AppData/Local/1338993av.jpg"
"1369683"
"C:/Users/Администратор/AppData/Local/1369683av.jpg"
"1406984"
"C:/Users/Администратор/AppData/Local/1406984av.jpg"
"1415343"
"C:/Users/Администратор/AppData/Local/1415343av.jpg"
"1415813"
"C:/Users/Администратор/AppData/Local/1415813av.jpg"
"1420001"
"C:/Users/Администратор/AppData/Local/1420001av.jpg"
"1420705"
"C:/Users/Администратор/AppData/Local/1420705av.jpg"
"1448967"
"C:/Users/Администратор/AppData/Local/1448967av.jpg"
"1453565"
"C:/Users/Администратор/AppData/Local/1453565av.jpg"
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
qrc:/content/MyDoc.qml:136:29: QML Image: ??????????? ???????? ?c?
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed
"http://192.168.100.38:8088/ords/alex_dba/avatar/img/1453565"
"FileName 1453565av.jpg"
Downloading is completed

void AppCore::p_avatar(QString text )
{
    url_avatar = "http://192.168.100.38:8088/ords/alex_dba/avatar/img/"+text;
    networkManager_av = new QNetworkAccessManager();
    f_RUN_avatar(url_avatar);
 }
void AppCore::f_RUN(QString url) { QNetworkReply *replay = networkManager->get(QNetworkRequest(QUrl(url))); connect(networkManager, &QNetworkAccessManager::finished, this, &AppCore::onResult); connect(replay, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(updateDownloadProgress(qint64,qint64))); } void AppCore::f_RUN_avatar(QString url) { QNetworkReply *replay_av = networkManager_av->get(QNetworkRequest(QUrl(url))); connect(networkManager_av, &QNetworkAccessManager::finished, this, &AppCore::onResult_avatar); }

void AppCore::onResult(QNetworkReply *reply)
{
    qint8 p_i;
    QString p_path;
    qDebug() << "Begin OnResult";
    p_path=QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
    qDebug() << p_path;
    if(!reply->error()){
        QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
        QJsonObject root = document.object();
        // Taking from the document root object
        int y;
        y=root.value("count").toInt();
        QString st1, st2, st3, st4, st5, st6;
        m_model->clearAnimal();
         // The second value prescribe line
        QJsonValue jv = root.value("items");
        // If the value is an array, ...
        if(jv.isArray()){
            // ... then pick from an array of properties
            QJsonArray ja = jv.toArray();
            // Going through all the elements of the array ...
            for(int i = 0; i < ja.count(); i++){
                QJsonObject subtree = ja.at(i).toObject();
                    st1 = QString::number(subtree.value("doc_id").toInt());
                    st2 = subtree.value("ca_name").toString();
                    st3 = subtree.value("full_reg_num").toString();
                    st4 = subtree.value("users_info").toString();
                    st5 = subtree.value("name_doc").toString();;
                    st6 = "test";
                    hatico=0;
                    p_i=0;
                    p_avatar(st1);
                    qDebug() << st1;
//                    while (p_i<1) {
//                        p_i=hatico;
//                    }
                    qDebug() << st1;
                    qDebug() << p_path+"/"+st1+"av.jpg";
m_model->addAnimal(Animal(st1, st2, st3, st4, st5, p_path+"/"+st1+"av.jpg"));
               }
        }
            emit sendToQmlRowCount(QString::number(root.value("count").toInt()));
    }
    reply->deleteLater();
}

void AppCore::onResult_avatar(QNetworkReply *reply_av)
{
    if(!reply_av->error()){
        QUrl url1 = QUrl::fromUserInput(url_avatar);
        QFileInfo fileInfo(url1.path());
        QString fileName=fileInfo.fileName()+"av";
        QString file_ext="jpg";
        qDebug() << url_avatar;
        qDebug() <<"FileName "+ fileName+"."+file_ext;
        QFile *file = new QFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) +"/"+ fileName+"."+file_ext);
        QFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) +"/"+fileName+"."+file_ext).exists();
        if(file->open(QFile::WriteOnly)){
            file->write(reply_av->readAll());  // ... и записываем всю информацию со страницы в файл
            file->close();                  // закрываем файл
        qDebug() << "Downloading is completed";
    }
    }
  //  else {
         // создаем фиктивный файл - нет фото ;
  //  }
    hatico=1;
    reply_av->deleteLater();
}

void AppCore::p_avatar(QString text )
{
    url_avatar = "http://192.168.100.38:8088/ords/alex_dba/avatar/img/"+text;
    networkManager_av = new QNetworkAccessManager();
    f_RUN_avatar(url_avatar);
 }

  • alex_lip
  • Вопрос
  • 12 сентября 2017 г. 14:55

Опять про скачивание файла из инета

Добрый день.
Вот по адресу http://192.168.100.38:8088/ords/alex_dba/doc/blob/366868 у меня лежит некий файл (неизвестно какой) но в броузере открывается или картинка или pdf.
Я по вашему совету сделал

void AppCore::f_RUN_im(QString url)
{

 QNetworkReply *replay =  networkManager->get(QNetworkRequest(QUrl(url)));

    connect(networkManager, &QNetworkAccessManager::finished, this, &AppCore::onResult_im);

    connect(replay, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(updateDownloadProgress(qint64,qint64)));
}

void AppCore::onResult_im(QNetworkReply *reply) { // If there are no errors if(!reply->error()){ // создаём объект для работы с файлом //QUrl url = QUrl::fromUserInput(url1); //QFileInfo fileInfo(url.path()); //QString fileName=fileInfo.fileName(); QFile *file = new QFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/file.jpg"); QFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/file.jpg").exists(); // Создаём файл или открываем его на перезапись ... if(file->open(QFile::WriteOnly)){ file->write(reply->readAll()); // ... и записываем всю информацию со страницы в файл file->close(); // закрываем файл qDebug() << "Downloading is completed"; QDesktopServices::openUrl(QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/file.jpg")); } } reply->deleteLater(); }

То есть я заранее прописываю расширение файла. А как мне это расширение(или полное имя) получить заранее? Непосредственно из url.  И можно ли в
:onResult_im(QNetworkReply *reply)
добавить  еще параметр - например url? Вроде бы в слотах нельзя параметры использовать

  • EVILEG
  • Ответ
  • 29 августа 2017 г. 23:18

Скачать и открыть файл под андроид

Если знаете url, по которому где-то лежит некая картинка или файл, то скачать можно через QNetworkAccessManager. Вот статья на эту тему . Там скачивается xml файл, но сути это не меняет. Нужно создать файл с нужным расширением и записать в него всё, что скачали.


Вообще рекомендую использовать QNetworkAccessManager для этого. Он достаточно гибкий в этом плане и позволяет реализовать очень многое. А всякие QTcpServer или QUdpSocket уже используют для специфичных протоколов, которые менее распространенны.
Реклама
  • Vadym
  • 26 сентября 2017 г. 18:10

C++ - Тест 005. Структуры и Классы

  • Результат - 83 баллов
  • Vadym
  • 26 сентября 2017 г. 18:05

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат - 80 баллов
  • Vadym
  • 26 сентября 2017 г. 4:44

C++ - Тест 003. Условия и циклы

  • Результат - 78 баллов
Последние комментарии
  • EVILEG
  • 22 сентября 2017 г. 12:45

Qt/C++ - Урок 055. QSignalMapper VS лямбда функции

Вы используете стандартную практику замыканий, когда нет никакой необходимости объявлять функции в классе, поскольку они используются в одном единственном месте класса, а объявление всех эти л...

  • Damir
  • 22 сентября 2017 г. 2:35

Qt/C++ - Урок 055. QSignalMapper VS лямбда функции

Может и кривовато но чёрт побери работает и класс от ненужной больше ни где фигни не разбухает.

  • Damir
  • 22 сентября 2017 г. 2:29

Qt/C++ - Урок 055. QSignalMapper VS лямбда функции

Как вам такое enum { PROFILE_TOOLPATH_FORM, POCKET_TOOLPATH_FORM, DRILLING_TOOLPATH_FORM }; QToolBar* toolpathToolBar = addToolBar(tr("Toolpa...

  • Mr_lKl
  • 17 сентября 2017 г. 16:14

QML - Урок 031. Отключаем системное обрамление окна в QML и пишем код для обработки перемещения и ресайза окна

Спасибо! Этим и займусь. Ещё попробую скинуть проект другу, посмотрю, как QT будет справляться там.

  • EVILEG
  • 17 сентября 2017 г. 14:14

QML - Урок 031. Отключаем системное обрамление окна в QML и пишем код для обработки перемещения и ресайза окна

Тогда это однознано баг, я бы глянул на официальном багтрекере Qt, есть ли информация об этом баге, и возможно стоит создать таск с этим багом.

Сейчас обсуждают на форуме
  • EVILEG
  • 27 сентября 2017 г. 1:54

Сборка проекта в Qt под Android.

В общем я вас не обрадую, я сегодня сам поразбирался с этой проблемой. И ... (барабанная дробь) ... Qt Creator 4.4 с багом. Это не работает в принципе. Фикс будет в Qt Creator 4.5. ...

  • EVILEG
  • 26 сентября 2017 г. 18:03

Как дождаться выполнения функции

Именно, а самому писать скачивание файла - это вам не нужно. Поэтому нужно правильно написать обработку процесса скачивания. Для этого и потребуется делать либо буфер. Либо обновлять GUI когда...

  • EVILEG
  • 26 сентября 2017 г. 16:58

Virtual Keyboard

Больше похоже на какой-то баг с клавиатурой. Перекопал разные варианты, а результат такой же. Кроме Британской раскладки ничего не работает.

  • verside
  • 20 сентября 2017 г. 12:39

Qt и Visual Studio (32-битная версия)

Делал ровно так, и описано. Но что-то не подхватывает Qt. Есть идеи, что Visual Studio какие-то переменные в окружение не прописал, но какие, пока не удалось понять. Я про...

Проблема при компиляции WebKit для Qt 5.7.1

Здравствуйте! Еще есть некоторые пользователи которые остались на Win XP.