alex_lip
alex_lipSept. 25, 2017, 10:21 a.m.

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

Возможно навязший на зубах вопрос, но тем не менее. Функция p_avatar скачивает файл с инета. Дело происходит в цикле. Как мне выполнить следующую строчку в цикле только после того как завершится функция p_avatar ? Пробовал через бесконечный цикл с глобальной переменной - но это чушь. Каким образом правильно это сделать?
 

 hatico=0;
 p_i=0;
 p_avatar(st1);
 qDebug() << st1;
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

16
Evgenii Legotckoi
  • Sept. 25, 2017, 10:30 a.m.
  • (edited)

А с чего строчка выводится раньше-то? qDebug() должен по логике выполнится после того, как будет завершена предыдущая процедура. то есть функция p_avatar().

Вы здесь чего-то недоговариваете. У вас асинхронно каким-то образом скачивание идёт? в другом потоке? Или как это реализовано?
Показывайте более детальный код.
 
Либо я неправильно вас понял. Переформулируйте вопрос.
    alex_lip
    • Sept. 26, 2017, 2:23 a.m.

    Сначала скачивается файл в формате 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
      • Sept. 26, 2017, 2:26 a.m.

      То есть получается, что мне надо в два потока скачивать? А как их синронизировать?

        Evgenii Legotckoi
        • Sept. 26, 2017, 2:52 a.m.
        Думаю, что нет. Получается, что вы хотите написать Downloading completed один раз?
        Ну вот смотрите, у вас в цикле возвращается количество картинок ja.count()
        Сохраните это количество в некую переменную, например
        int m_allImagesSize;
        Которая будет объявлена в заголовочном файле класса.
        И ещё объявите переменную счётчика, также в заголовочном файле:
        int m_imageDownloadedCounter;
        Потом, перед началом цикла по скачиванию картинок настраиваете эти переменные:
        ***
        m_allImagesSize = ja.count();
        m_imageDownloadedCounter = 0;
        
         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"));
                       }
        А в обработчике результата скачивания уже инкрементируете счётчик, и когда он будет равен количеству изображений, выписываете информацию о том, что скачивание завершилось.
        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 {
                 // создаем фиктивный файл - нет фото ;
          //  }
        
            ++m_imageDownloadedCounter;
            if (m_imageDownloadedCounter == (m_allImagesSize - 1))
            {
                  qDebug() << "Downloading is completed";
            }
            hatico=1;
            reply_av->deleteLater(); 
          alex_lip
          • Sept. 26, 2017, 3:21 a.m.

          Да у меня проблема в  том, что картинки НЕ скачиваются во время цикла. Они почему то скачиваются ПОТОМ!! Когда цикл уже закончился. В логе видно, что строка формируется правильно, а скачивание происходит ПОТОМ  и только последний файл.

            Evgenii Legotckoi
            • Sept. 26, 2017, 3:25 a.m.

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

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

              Так у меня модель(для QML слоя) формируется во время цикла  -

              m_model->addAnimal(Animal(st1, st2, st3, st4, st5, p_path+"/"+st1+"av.jpg"));
              Я не понимаю как внедрение счетчика может повлиять на то, чтобы каждая картинка скачалась внутри цикла по разбору json файла.
              Еще раз - скачивается таблица - скачалась - идет ее разбор. В каждой строчке есть ссылка на файл, который ВНУТРИ цикла должен скачаться - то есть цикл начался - файл скачался - цикл продолжился - файл скачался и т.д. По логу работы видно, что у меня цикл полностью завершился - потом отработала модель, которая не нашла картинок - а уже потом отработала загрузка только последней картинки несколько раз. Здесь явна какая-то рассинхронность! То есть ВНУТРИ цикла файл не скачивается! Вы правильно сказали про асинхронность - как мне поставить семафоры ?

                Evgenii Legotckoi
                • Sept. 26, 2017, 4:45 a.m.
                • (edited)

                Так бы и сказали, что проблема в том, что модель данные не получает, я думал что нужно что-то вывести в конце загрузки всех файлов.

                А так правильно, что не скачивается внутри цикла, елси будет скачиваться внутри цикла, то это скачивание картинок повесит нафиг весь GUI, потом будете искать способ, как сделать так, чтобы интерфейс не замерзал во время скачивания.

                Фактически, я и не говорил, что нужно делать синхронное скачивание, проблем ещё больше получите. Здесь нужно изменить логику поведения кода. Как я понимаю:
                m_model->addAnimal(Animal(st1, st2, st3, st4, st5, p_path+"/"+st1+"av.jpg"));
                Это добавляет инфорамцию об изображении, но сама модель не хранит изображение, например, в качестве QImage... или всё таки хранит? Не вижу кода конструктора Animal.
                Так вот, проблема в том, что обновлять GUI через сигнал нужно тогда, когда произошла загрузка всех изображений.
                ++m_imageDownloadedCounter;
                if (m_imageDownloadedCounter == (m_allImagesSize - 1))
                {
                    emit sendToQmlRowCount(QString::number(root.value("count").toInt()));
                }
                А если хотите, чтобы интерфейс обновлялся после загрузки каждой картинке, то тогда необходимо сделать некий Буфер объекто Animal, который формируется в первоначальном цикле, а в методе обработки скачивания изображений, проверять наличие объекта Animal по соответствию имени изображения, если найдено, то добавлять в модель. а из буффера удалять этот объект. И уже после этого обновлять интерфейс черех сигнал.

                  alex_lip
                  • Sept. 26, 2017, 5:02 a.m.

                  Спасибо! Буду пробовать. Сама модель изображение не хранит. Я тестовую картинку просто в таком виде выводил.
                  m_model->addAnimal(Animal(st1, st2, st3, st4, st5, "qrc:///covers/AprilRain.png");

                    Evgenii Legotckoi
                    • Sept. 26, 2017, 5:06 a.m.

                    Тогда делайте буфер, какой-нибудь QVector<Animal> animalBuffer;

                    В него помещайте в основном цикле все новые объекты.
                    А потом, когда картинка скачалась. Проверяйте по каким-нибудь признакам, например имя файла, наличие картинке в этом буфере. Перемещайте из буфера в модель. И высылайте сигнал на обновление.
                      alex_lip
                      • Sept. 26, 2017, 7:02 a.m.
                      • (edited)

                      Я все-таки пытаюсь в основном цикле добиться последовательного скачивания картинок
                      Вот вместо фукции p_avatar(st1)  написал

                      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;

                      url_avatar = "http://192.168.100.38:8088/ords/alex_dba/avatar/img/"+st1; QNetworkRequest request(url_avatar); QNetworkReply* reply= networkManager_av->get(request); reply->setProperty("fileName", st1); // use dynamic-properties connect( reply, SIGNAL(finished()),this, SLOT(onResult_avatar()));

                      m_model->addAnimal(Animal(st1, st2, st3, st4, st5, p_path+"/"+st1+"av.jpg"));
                      ...
                      Почему то SLOT onResult_avatar ругается - QObject::connect: No such slot AppCore::onResult_avatar() хотя он есть

                      void AppCore::onResult_avatar(QNetworkReply *reply_av)
                      {
                          // If there are no errors
                          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";
                      
                      //    QDesktopServices::openUrl(QUrl::fromLocalFile(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/file."+file_ext));
                          }
                          }
                        //  else {
                               // создаем фиктивный файл - нет фото ;
                        //  }
                          hatico=1;
                          reply_av->deleteLater();
                      
                      }
                      

                      и в appcore.h

                      private slots:
                          void onResult_avatar(QNetworkReply *reply_av);

                      Вообще в принципе невозможно последовательное скачивание файлов внутри цикла? Обязательно надо заготовить список из url и затем весь его подсунуть уже после цикла ? И модель строить после счетчика последнего файла?





                        alex_lip
                        • Sept. 26, 2017, 7:14 a.m.

                        Принципиальный вопрос -
                        оператор

                        m_model->addAnimal(Animal(st1, st2, st3, st4, st5, p_path+"/"+st1+"av.jpg"));
                        выполнится после окончания ?
                        connect( reply, SIGNAL(finished()),this, SLOT(onResult_avatar())); 
                        То есть будет дожидаться окончания работы функции onResult_avatar() или нет?



                          alex_lip
                          • Sept. 26, 2017, 7:56 a.m.

                          Судя по всему функция в слоте(с учетом работы Networkadapter) будет исполнятся независимо от основного потока.

                            Evgenii Legotckoi
                            • Sept. 26, 2017, 8:03 a.m.

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

                              alex_lip
                              • Sept. 27, 2017, 2:52 a.m.
                              • The answer was marked as a solution.

                              Чтобы закончить эту тему напишу тем кто как и я блуждает в потемках - чтобы обратили внимание на следующее
                              1)

                                  networkManager_av = new QNetworkAccessManager();
                                  connect(networkManager_av, &QNetworkAccessManager::finished, this, &AppCore::onResult_avatar);
                              ставим ПЕРЕД циклом.
                              2) В моем случае в слот надо было передать имя файла - отличная конструкция

                              reply_av->setProperty("fileName", sp_files[i]+"av");
                              3) Я как и посоветовал Евгений сделал счетчик и после того как все файлы прочитаны меняю модель. Но здесь у меня есть вопрос - я отдельную тему создам. (Кстати модель меняется сразу после m_model->addAnimal(Animal(...));  Emit не обязательно для этого делать)

                               hatico_prom++;
                                  if (hatico_prom==hatico) {
                                      qDebug() << "ALL Downloading is completed hatico= "<<hatico;
                                      emit sendToQmlRowCount(QString::number(hatico));
                                  }

                              void AppCore::p_avatar()
                              {
                                  networkManager_av = new QNetworkAccessManager();
                                  connect(networkManager_av, &QNetworkAccessManager::finished, this, &AppCore::onResult_avatar);
                                  qDebug()<<sp_url_avatar;
                                  qDebug() << "sp_url_avatar=" << sp_url_avatar.size();
                                  qDebug() << "sp_files="<<sp_files;
                                  qDebug() << "hatico=" <<hatico;
                                  for (int i=0; i<hatico; ++i)
                                  {
                                      url_avatar=sp_url_avatar[i];
                                      QNetworkReply *reply_av = networkManager_av->get(QNetworkRequest(QUrl(sp_url_avatar[i])));
                                      reply_av->setProperty("fileName", sp_files[i]+"av");
                                   }
                              }

                              void AppCore::onResult_avatar(QNetworkReply *reply_av)
                              {
                                 if(!reply_av->error()){
                                      //  создаём объект для работы с файлом
                                      //QUrl url1 = QUrl::fromUserInput(url_avatar);
                                      //QFileInfo fileInfo(url1.path());
                                     // QByteArray data = reply_av->readAll();
                                      QString fileName = reply_av->property("fileName").toString();
                                      QString file_ext="jpg";
                                      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_prom++;
                                  if (hatico_prom==hatico) {
                                      qDebug() << "ALL Downloading is completed hatico= "<<hatico;
                                      emit sendToQmlRowCount(QString::number(hatico));
                                  }
                                  reply_av->deleteLater();
                              }




                                Evgenii Legotckoi
                                • Sept. 27, 2017, 3:01 a.m.

                                Замечательное решение с динамическими свойствами QObject, я совсем забыл про эту фишку Qt

                                  Comments

                                  Only authorized users can post comments.
                                  Please, Log in or Sign up
                                  d
                                  • dsfs
                                  • April 26, 2024, 4:56 a.m.

                                  C ++ - Test 004. Pointers, Arrays and Loops

                                  • Result:80points,
                                  • Rating points4
                                  d
                                  • dsfs
                                  • April 26, 2024, 4:45 a.m.

                                  C++ - Test 002. Constants

                                  • Result:50points,
                                  • Rating points-4
                                  d
                                  • dsfs
                                  • April 26, 2024, 4:35 a.m.

                                  C++ - Test 001. The first program and data types

                                  • Result:73points,
                                  • Rating points1
                                  Last comments
                                  k
                                  kmssrFeb. 8, 2024, 6:43 p.m.
                                  Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  EVA
                                  EVADec. 25, 2023, 10:30 a.m.
                                  Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                  J
                                  JonnyJoDec. 25, 2023, 8:38 a.m.
                                  Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                  G
                                  GvozdikDec. 18, 2023, 9:01 p.m.
                                  Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                  Now discuss on the forum
                                  G
                                  George13May 7, 2024, 12:27 a.m.
                                  добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
                                  BlinCT
                                  BlinCTMay 5, 2024, 5:46 a.m.
                                  Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                  PS
                                  Peter SonMay 3, 2024, 5:57 p.m.
                                  Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiMay 2, 2024, 2:07 p.m.
                                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
                                  IscanderChe
                                  IscanderCheApril 30, 2024, 4:22 a.m.
                                  Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

                                  Follow us in social networks