alex_lip
alex_lip25 сентября 2017 г. 10:21

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

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

 hatico=0;
 p_i=0;
 p_avatar(st1);
 qDebug() << st1;
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
Evgenii Legotckoi
  • 25 сентября 2017 г. 10:30
  • (ред.)

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

Вы здесь чего-то недоговариваете. У вас асинхронно каким-то образом скачивание идёт? в другом потоке? Или как это реализовано?
Показывайте более детальный код.
 
Либо я неправильно вас понял. Переформулируйте вопрос.
    alex_lip
    • 26 сентября 2017 г. 2: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
      • 26 сентября 2017 г. 2:26

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

        Evgenii Legotckoi
        • 26 сентября 2017 г. 2:52
        Думаю, что нет. Получается, что вы хотите написать 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
          • 26 сентября 2017 г. 3:21

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

            Evgenii Legotckoi
            • 26 сентября 2017 г. 3:25

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

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

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

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

                Evgenii Legotckoi
                • 26 сентября 2017 г. 4:45
                • (ред.)

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

                А так правильно, что не скачивается внутри цикла, елси будет скачиваться внутри цикла, то это скачивание картинок повесит нафиг весь 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
                  • 26 сентября 2017 г. 5:02

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

                    Evgenii Legotckoi
                    • 26 сентября 2017 г. 5:06

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

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

                      Я все-таки пытаюсь в основном цикле добиться последовательного скачивания картинок
                      Вот вместо фукции 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
                        • 26 сентября 2017 г. 7:14

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

                        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
                          • 26 сентября 2017 г. 7:56

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

                            Evgenii Legotckoi
                            • 26 сентября 2017 г. 8:03

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

                              alex_lip
                              • 27 сентября 2017 г. 2:52
                              • Ответ был помечен как решение.

                              Чтобы закончить эту тему напишу тем кто как и я блуждает в потемках - чтобы обратили внимание на следующее
                              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
                                • 27 сентября 2017 г. 3:01

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

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  AD

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

                                  • Результат:50баллов,
                                  • Очки рейтинга-4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 1:37

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

                                  • Результат:80баллов,
                                  • Очки рейтинга4
                                  m
                                  • molni99
                                  • 26 октября 2024 г. 1:29

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

                                  • Результат:20баллов,
                                  • Очки рейтинга-10
                                  Последние комментарии
                                  i
                                  innorwall13 ноября 2024 г. 23:03
                                  Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
                                  i
                                  innorwall13 ноября 2024 г. 20:09
                                  Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
                                  i
                                  innorwall11 ноября 2024 г. 22:12
                                  Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                                  i
                                  innorwall11 ноября 2024 г. 18:23
                                  QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                                  i
                                  innorwall11 ноября 2024 г. 15:50
                                  Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                                  Сейчас обсуждают на форуме
                                  i
                                  innorwall14 ноября 2024 г. 0:39
                                  добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
                                  i
                                  innorwall11 ноября 2024 г. 10:55
                                  Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                                  9
                                  9Anonim25 октября 2024 г. 9:10
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                                  ИМ
                                  Игорь Максимов3 октября 2024 г. 4:05
                                  Реализация навигации по разделам Спасибо Евгений!

                                  Следите за нами в социальных сетях