Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QNetworkAccessManager in loop ?
Forum Updated to NodeBB v4.3 + New Features

QNetworkAccessManager in loop ?

Scheduled Pinned Locked Moved Solved General and Desktop
5 Posts 3 Posters 1.8k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    sonichy
    wrote on 5 Jun 2017, 14:57 last edited by
    #1

    I need to download images to setPixmap of QLabels.
    Only one is OK, more than one have no effort.
    How to use QNetworkAccessManager in loop ?

    alt text

    void FormFind::search()
    {
        QString sql="select * from user where name like '%" + ui->lineEdit->text() + "%'";
        bool b=query.exec(sql);
        while(query.next())
        {
            int ids = query.value("id").toInt();
            QString name = query.value("name").toString();
            QString sex = query.value("sex").toString();
            QString urla=query.value("avantar").toString();
            itemfind=new ItemFind;        
            itemfind->ui->labelAccount->setText(QString::number(ids));
            itemfind->ui->labelName->setText(name);
            itemfind->ui->labelSex->setText(sex);
            itemfind->ui->labelDomicile->setText(domicile);                
            QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget);
            ui->listWidget->addItem(LWI);
            ui->listWidget->setItemWidget(LWI,itemfind);
            LWI->setSizeHint(QSize(140,70));    
            
            QNetworkAccessManager *manager = new QNetworkAccessManager(this);
            connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyPixmap(QNetworkReply*)));
            manager->get(QNetworkRequest(QUrl(urla)));
        }
    }
    
    void FormFind::replyPixmap(QNetworkReply* reply)
    {
        qDebug() << "reply" << reply->error();
        QPixmap pixmap;
        pixmap.loadFromData(reply->readAll());
        itemfind->ui->labelAvantar->setPixmap(pixmap.scaled(50,50));
    }
    

    https://github.com/sonichy

    K 1 Reply Last reply 5 Jun 2017, 18:45
    0
    • S sonichy
      5 Jun 2017, 14:57

      I need to download images to setPixmap of QLabels.
      Only one is OK, more than one have no effort.
      How to use QNetworkAccessManager in loop ?

      alt text

      void FormFind::search()
      {
          QString sql="select * from user where name like '%" + ui->lineEdit->text() + "%'";
          bool b=query.exec(sql);
          while(query.next())
          {
              int ids = query.value("id").toInt();
              QString name = query.value("name").toString();
              QString sex = query.value("sex").toString();
              QString urla=query.value("avantar").toString();
              itemfind=new ItemFind;        
              itemfind->ui->labelAccount->setText(QString::number(ids));
              itemfind->ui->labelName->setText(name);
              itemfind->ui->labelSex->setText(sex);
              itemfind->ui->labelDomicile->setText(domicile);                
              QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget);
              ui->listWidget->addItem(LWI);
              ui->listWidget->setItemWidget(LWI,itemfind);
              LWI->setSizeHint(QSize(140,70));    
              
              QNetworkAccessManager *manager = new QNetworkAccessManager(this);
              connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyPixmap(QNetworkReply*)));
              manager->get(QNetworkRequest(QUrl(urla)));
          }
      }
      
      void FormFind::replyPixmap(QNetworkReply* reply)
      {
          qDebug() << "reply" << reply->error();
          QPixmap pixmap;
          pixmap.loadFromData(reply->readAll());
          itemfind->ui->labelAvantar->setPixmap(pixmap.scaled(50,50));
      }
      
      K Offline
      K Offline
      koahnig
      wrote on 5 Jun 2017, 18:45 last edited by
      #2

      @sonichy

      As you have it at the moment you are creating every time a QNetworkAccessManager. This is not required. See third paragraph in detailed description it says:
      Once a QNetworkAccessManager object has been created, the application can use it to send requests over the network.

      You can basically fire a number of request to the same QNetworkAccessManager. Only with large numbers you probably need to check, if this is possible. Also the sequence of replies may not be identical to the sequence of your actual replies AFAIK.

      You might want tocheck also how to delete the replies after your processing. Checkout the notes between those examples in the detailed description. Use deleteLater for teh replies.

      Vote the answer(s) that helped you to solve your issue(s)

      1 Reply Last reply
      2
      • S Offline
        S Offline
        sonichy
        wrote on 14 Jun 2017, 02:50 last edited by
        #3

        I found a solution: package net request and reply in sub item, trigger them in parent with function.

        void FormFind::search()
        {
            QString sql="select * from user where name like '%" + ui->lineEdit->text() + "%'";
            bool b=query.exec(sql);
            while(query.next())
            {
                int ids = query.value("id").toInt();
                QString name = query.value("name").toString();
                QString sex = query.value("sex").toString();
                QString urla=query.value("avantar").toString();
                ItemFind *itemfind=new ItemFind;        
                itemfind->ui->labelAccount->setText(QString::number(ids));
                itemfind->ui->labelName->setText(name);
                itemfind->ui->labelSex->setText(sex);
                itemfind->ui->labelDomicile->setText(domicile);   
                QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget);
                ui->listWidget->addItem(LWI);
                ui->listWidget->setItemWidget(LWI,itemfind);
                LWI->setSizeHint(QSize(140,70));
                itemfind->getPixmap(urla);     // trigger
            }
        }
        
        void ItemFind::getPixmap(QString url)
        {
            QNetworkAccessManager *manager = new QNetworkAccessManager(this);
            connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyPixmap(QNetworkReply*)));
            manager->get(QNetworkRequest(QUrl(url)));
        }
        
        void ItemFind::replyPixmap(QNetworkReply* reply)
        {  
            QPixmap pixmap;
            pixmap.loadFromData(reply->readAll());
            ui->labelAvantar->setPixmap(pixmap.scaled(60,60));
        }

        https://github.com/sonichy

        K S 2 Replies Last reply 14 Jun 2017, 08:51
        0
        • S sonichy
          14 Jun 2017, 02:50

          I found a solution: package net request and reply in sub item, trigger them in parent with function.

          void FormFind::search()
          {
              QString sql="select * from user where name like '%" + ui->lineEdit->text() + "%'";
              bool b=query.exec(sql);
              while(query.next())
              {
                  int ids = query.value("id").toInt();
                  QString name = query.value("name").toString();
                  QString sex = query.value("sex").toString();
                  QString urla=query.value("avantar").toString();
                  ItemFind *itemfind=new ItemFind;        
                  itemfind->ui->labelAccount->setText(QString::number(ids));
                  itemfind->ui->labelName->setText(name);
                  itemfind->ui->labelSex->setText(sex);
                  itemfind->ui->labelDomicile->setText(domicile);   
                  QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget);
                  ui->listWidget->addItem(LWI);
                  ui->listWidget->setItemWidget(LWI,itemfind);
                  LWI->setSizeHint(QSize(140,70));
                  itemfind->getPixmap(urla);     // trigger
              }
          }
          
          void ItemFind::getPixmap(QString url)
          {
              QNetworkAccessManager *manager = new QNetworkAccessManager(this);
              connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyPixmap(QNetworkReply*)));
              manager->get(QNetworkRequest(QUrl(url)));
          }
          
          void ItemFind::replyPixmap(QNetworkReply* reply)
          {  
              QPixmap pixmap;
              pixmap.loadFromData(reply->readAll());
              ui->labelAvantar->setPixmap(pixmap.scaled(60,60));
          }
          K Offline
          K Offline
          koahnig
          wrote on 14 Jun 2017, 08:51 last edited by
          #4

          @sonichy

          Glad to read that you have solved your issue. Thanks for providing a potential solution for others.

          Vote the answer(s) that helped you to solve your issue(s)

          1 Reply Last reply
          0
          • S sonichy
            14 Jun 2017, 02:50

            I found a solution: package net request and reply in sub item, trigger them in parent with function.

            void FormFind::search()
            {
                QString sql="select * from user where name like '%" + ui->lineEdit->text() + "%'";
                bool b=query.exec(sql);
                while(query.next())
                {
                    int ids = query.value("id").toInt();
                    QString name = query.value("name").toString();
                    QString sex = query.value("sex").toString();
                    QString urla=query.value("avantar").toString();
                    ItemFind *itemfind=new ItemFind;        
                    itemfind->ui->labelAccount->setText(QString::number(ids));
                    itemfind->ui->labelName->setText(name);
                    itemfind->ui->labelSex->setText(sex);
                    itemfind->ui->labelDomicile->setText(domicile);   
                    QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget);
                    ui->listWidget->addItem(LWI);
                    ui->listWidget->setItemWidget(LWI,itemfind);
                    LWI->setSizeHint(QSize(140,70));
                    itemfind->getPixmap(urla);     // trigger
                }
            }
            
            void ItemFind::getPixmap(QString url)
            {
                QNetworkAccessManager *manager = new QNetworkAccessManager(this);
                connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyPixmap(QNetworkReply*)));
                manager->get(QNetworkRequest(QUrl(url)));
            }
            
            void ItemFind::replyPixmap(QNetworkReply* reply)
            {  
                QPixmap pixmap;
                pixmap.loadFromData(reply->readAll());
                ui->labelAvantar->setPixmap(pixmap.scaled(60,60));
            }
            S Offline
            S Offline
            seyed
            wrote on 8 Oct 2020, 06:42 last edited by seyed 10 Aug 2020, 06:44
            #5

            @sonichy its working but is not optimised. You can prevent creating many objects by using QNetworkReply and C++11 lambda as follow:

            void FormFind::search()
            {
                QString sql="select * from user where name like '%" + ui->lineEdit->text() + "%'";
                bool b=query.exec(sql);
                QNetworkAccessManager *manager = new QNetworkAccessManager(this);
                while(query.next())
                {
                    int ids = query.value("id").toInt();
                    QString name = query.value("name").toString();
                    QString sex = query.value("sex").toString();
                    QString urla=query.value("avantar").toString();
                    itemfind=new ItemFind;        
                    itemfind->ui->labelAccount->setText(QString::number(ids));
                    itemfind->ui->labelName->setText(name);
                    itemfind->ui->labelSex->setText(sex);
                    itemfind->ui->labelDomicile->setText(domicile);                
                    QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget);
                    ui->listWidget->addItem(LWI);
                    ui->listWidget->setItemWidget(LWI,itemfind);
                    LWI->setSizeHint(QSize(140,70));    
                    
                    QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(urla)));
                    connect(reply, &QNetworkReply::finished, [=, &reply, &itemfind]() {
                        //handle http redirection (code 302) if you like as described in
                        //  https://forum.qt.io/topic/50516/qnetworkreply-readall-gets-empty-data-on-finished/23
                        if(reply->error() == QNetworkReply::NoError)
                        {
                            QByteArray response = reply->readAll();
                            itemfind->loadPixmap(response);
                        }
                        else
                        {
                            qDebug() << "reply" << reply->error();
                        }
                        reply->deleteLater();
                    }
                }
            }
            
            void ItemFind::loadPixmap(QByteArray data)
            {
                QPixmap pixmap;
                pixmap.loadFromData(data);
                ui->labelAvantar->setPixmap(pixmap.scaled(60,60));
            }
            
            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved