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
                                  Последние комментарии
                                  ИМ
                                  Игорь Максимов22 ноября 2024 г. 11:51
                                  Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                                  Evgenii Legotckoi
                                  Evgenii Legotckoi31 октября 2024 г. 14:37
                                  Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                                  A
                                  ALO1ZE19 октября 2024 г. 8:19
                                  Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                                  ИМ
                                  Игорь Максимов5 октября 2024 г. 7:51
                                  Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                                  d
                                  dblas55 июля 2024 г. 11:02
                                  QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  Сейчас обсуждают на форуме
                                  m
                                  moogo22 ноября 2024 г. 7:17
                                  Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
                                  Evgenii Legotckoi
                                  Evgenii Legotckoi24 июня 2024 г. 15:11
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  t
                                  tonypeachey115 ноября 2024 г. 6:04
                                  google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                                  NSProject
                                  NSProject4 июня 2022 г. 3:49
                                  Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

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