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
                                  AD

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

                                  • Result:50points,
                                  • Rating points-4
                                  m

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

                                  • Result:80points,
                                  • Rating points4
                                  m

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

                                  • Result:20points,
                                  • Rating points-10
                                  Last comments
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZEOct. 19, 2024, 8:19 a.m.
                                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь МаксимовOct. 5, 2024, 7:51 a.m.
                                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas5July 5, 2024, 11:02 a.m.
                                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  k
                                  kmssrFeb. 8, 2024, 6:43 p.m.
                                  Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  Now discuss on the forum
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  t
                                  tonypeachey1Nov. 15, 2024, 6:04 a.m.
                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                  NSProject
                                  NSProjectJune 4, 2022, 3:49 a.m.
                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                                  9
                                  9AnonimOct. 25, 2024, 9:10 a.m.
                                  Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                                  Follow us in social networks