alex_lip
alex_lipҚыр. 25, 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

                                  Пікірлер

                                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                                  Кіріңіз немесе Тіркеліңіз
                                  Г

                                  C++ - Тест 001. Первая программа и типы данных

                                  • Нәтиже:66ұпай,
                                  • Бағалау ұпайлары-1
                                  t

                                  C++ - Тест 001. Первая программа и типы данных

                                  • Нәтиже:33ұпай,
                                  • Бағалау ұпайлары-10
                                  t

                                  Qt - Тест 001. Сигналы и слоты

                                  • Нәтиже:52ұпай,
                                  • Бағалау ұпайлары-4
                                  Соңғы пікірлер
                                  G
                                  GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                                  Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                                  d
                                  dblas5Шілде 5, 2024, 11:02 Т.Ж.
                                  QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                                  k
                                  kmssrАқп. 8, 2024, 6:43 Т.Қ.
                                  Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  АК
                                  Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                                  Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  Енді форумда талқылаңыз
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                                  F
                                  FynjyШілде 22, 2024, 4:15 Т.Ж.
                                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                                  BlinCT
                                  BlinCTМаусым 25, 2024, 1 Т.Ж.
                                  Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                                  BlinCT
                                  BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                                  Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                                  Evgenii Legotckoi
                                  Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                                  Бізді әлеуметтік желілерде бақылаңыз