Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Get Image FileList from FTP server
Forum Updated to NodeBB v4.3 + New Features

Get Image FileList from FTP server

Scheduled Pinned Locked Moved Solved Mobile and Embedded
widgetmobileandroidiphoneqt5.4
13 Posts 2 Posters 6.7k Views 2 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.
  • M mkdh
    29 Jul 2015, 03:08

    @p3c0
    Thanks for your reply.
    But this is not the question I want to ask. ^____^
    my question is:
    I want to get icon in the GetListIcon method and return this icon,
    then I can put this icon to my FileList...

    When I trace the process in Qt, its process flow look like:
    --->start BindLV()
    --->i=0--->GetListIcon(tmpFilePaht)---->set signal,slot and trigger this event //yet finished
    --->i=1--->GetListIcon(tmpFilePaht)---->set signal,slot and trigger this event//yet finished
    --->i=2--->GetListIcon(tmpFilePaht)---->set signal,slot and trigger this event//yet finished
    ........
    --->end BindLV()
    --->replyIcon(QNetworkReply*) for i=2 // finished here
    --->replyIcon(QNetworkReply*) for i=0 // finished here
    --->replyIcon(QNetworkReply*) for i=1 // finished here
    ...

    Now, I find a solution,
    active slot replyFinished(QNetworkReply*) //get filelist
    --->setlsIcon()//get iconList //set signal and slot for each file and trigger those event.
    --->BindLV()
    when filelist.count()==iconList.count() in the slot replyIcon(QNetworkReply *reply)
    //I modify this method. I bind ListView with fileList and iconList.

    But I must waiting till all file has been download.......it is a long time.

    Dose any one has other ideas? or suggestion?

    P Offline
    P Offline
    p3c0
    Moderators
    wrote on 29 Jul 2015, 09:21 last edited by
    #4

    @mkdh Do you mean that you want to wait till the complete image is downloaded ? Since QNetworkAccessManager is asynchronous you will need to implement your own event loop and quit it when finished. For eg. in your function

    QIcon diaCloudFileList::GetListIcon(QString strFilePath){
       QNetworkAccessManager *manager= new QNetworkAccessManager(this);
       ...
       QNetworkRequest request(url);
       QNetworkReply *reply = manager->get(request);
       QEventLoop loop;
       connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
       loop.exec();
       //Then usual stuff
       QByteArray data = reply->readAll();
       QPixmap pix;
       pix.loadFromData(data);
       return QIcon(pix);
    }
    

    Did I get it right ?

    157

    M 3 Replies Last reply 30 Jul 2015, 01:45
    0
    • P p3c0
      29 Jul 2015, 09:21

      @mkdh Do you mean that you want to wait till the complete image is downloaded ? Since QNetworkAccessManager is asynchronous you will need to implement your own event loop and quit it when finished. For eg. in your function

      QIcon diaCloudFileList::GetListIcon(QString strFilePath){
         QNetworkAccessManager *manager= new QNetworkAccessManager(this);
         ...
         QNetworkRequest request(url);
         QNetworkReply *reply = manager->get(request);
         QEventLoop loop;
         connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
         loop.exec();
         //Then usual stuff
         QByteArray data = reply->readAll();
         QPixmap pix;
         pix.loadFromData(data);
         return QIcon(pix);
      }
      

      Did I get it right ?

      M Offline
      M Offline
      mkdh
      wrote on 30 Jul 2015, 01:45 last edited by mkdh
      #5

      @p3c0
      It is work. ^^!

      1 Reply Last reply
      0
      • P p3c0
        29 Jul 2015, 09:21

        @mkdh Do you mean that you want to wait till the complete image is downloaded ? Since QNetworkAccessManager is asynchronous you will need to implement your own event loop and quit it when finished. For eg. in your function

        QIcon diaCloudFileList::GetListIcon(QString strFilePath){
           QNetworkAccessManager *manager= new QNetworkAccessManager(this);
           ...
           QNetworkRequest request(url);
           QNetworkReply *reply = manager->get(request);
           QEventLoop loop;
           connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
           loop.exec();
           //Then usual stuff
           QByteArray data = reply->readAll();
           QPixmap pix;
           pix.loadFromData(data);
           return QIcon(pix);
        }
        

        Did I get it right ?

        M Offline
        M Offline
        mkdh
        wrote on 30 Jul 2015, 02:08 last edited by mkdh
        #6

        @p3c0

        The total time for loading all those images would be need waste some waiting time.
        Is it possible to make my process more quickly? (multi thread or...)

        QIcon diaCloudFileList::GetListIcon(QString strFilePath){
           icon=QIcon(":/Icon/Resources/Icon/ZhsFile.png");
        
        QNetworkAccessManager *manager= new QNetworkAccessManager(this);
        QUrl url("ftp://xxx@xx.xx.xx.xx/xx"+strFilePath+".jpg");
        url.setUserName("xx");
        url.setPassword("xxx");
        url.setPort(21);
        QNetworkRequest request(url);
        QNetworkReply* reply=manager->get(request);
        QEventLoop eventloop;
        connect(reply,SIGNAL(finished()),&eventloop,SLOT(quit()));
        eventloop.exec();
        QByteArray data = reply->readAll();
        QPixmap pix;
        pix.loadFromData(data);
        icon=QIcon(pix);
        return icon;
        }
        
        1 Reply Last reply
        0
        • P p3c0
          29 Jul 2015, 09:21

          @mkdh Do you mean that you want to wait till the complete image is downloaded ? Since QNetworkAccessManager is asynchronous you will need to implement your own event loop and quit it when finished. For eg. in your function

          QIcon diaCloudFileList::GetListIcon(QString strFilePath){
             QNetworkAccessManager *manager= new QNetworkAccessManager(this);
             ...
             QNetworkRequest request(url);
             QNetworkReply *reply = manager->get(request);
             QEventLoop loop;
             connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
             loop.exec();
             //Then usual stuff
             QByteArray data = reply->readAll();
             QPixmap pix;
             pix.loadFromData(data);
             return QIcon(pix);
          }
          

          Did I get it right ?

          M Offline
          M Offline
          mkdh
          wrote on 30 Jul 2015, 02:42 last edited by
          #7

          @p3c0
          PS:
          I find the method which I mention yesterday is more fast.

          P 1 Reply Last reply 30 Jul 2015, 06:37
          0
          • M mkdh
            30 Jul 2015, 02:42

            @p3c0
            PS:
            I find the method which I mention yesterday is more fast.

            P Offline
            P Offline
            p3c0
            Moderators
            wrote on 30 Jul 2015, 06:37 last edited by
            #8

            @mkdh Which method ?

            157

            M 2 Replies Last reply 30 Jul 2015, 09:22
            0
            • P p3c0
              30 Jul 2015, 06:37

              @mkdh Which method ?

              M Offline
              M Offline
              mkdh
              wrote on 30 Jul 2015, 09:22 last edited by p3c0
              #9

              @p3c0

              void diaCloudFileList::replyFinished(QNetworkReply *reply){
                  QByteArray bytes=reply->readAll();
                  QString str="";
                  for(int i=0;i<bytes.size();i++){
                      str+=bytes.at(i);
                  }
                  //show each line
                  QStringList input_rows(str.split(QRegExp("\n|\r\n|\r")));
                  slFileName=input_rows;
                  reply->close();
                  BindLV_Asynchronous();
                  reply->close();
                  setlsIcon();
              }
              void diaCloudFileList::BindLV_Asynchronous(){
                  init_styleditemdelegate_cell *listdelegate;
                  model = new QStandardItemModel(this);
                  ui->lvwFile->setModel(model);
                  listdelegate = new init_styleditemdelegate_cell();
                  ui->lvwFile->setItemDelegate(listdelegate);
                  QStandardItem *item ;//= new QStandardItem();
                  QDir dir=QDir::rootPath();
                  QString myPath;
              
                  myPath=gData->strFileFolder;
                  dir.cd(gData->strFileFolder);
                  dir.setNameFilters(QStringList()<<"*.xxx");
              
                  qDebug() << "Scanning: " << dir.path();
              
                  QStringList fileList=slFileName;
                  for (int i=0; i<fileList.count(); i++)
                  {
                      item = new QStandardItem();
              
                      QString tmpFilePaht=fileList[i];
                      QStringList sltmpFileName(tmpFilePaht.split("/"));
                      //        ui->lblWaiting->setText(strWait+QString::number(i+1)+"/"+QString::number(this->slFileName.count()));//"Please wait.. Process Loading...""
              
                      icon=QIcon(":/Icon/Resources/Icon/xxxFile.png");
                      item->setData(icon,init_styleditemdelegate_cell::IconRole);
                      item->setData(tmpFilePaht,init_styleditemdelegate_cell::headerTextRole);
                      item->setData(sltmpFileName[sltmpFileName.count()-1]+".zhs",init_styleditemdelegate_cell::subHeaderTextrole);
                      item->setEditable(false);
                      model->appendRow(item);
                  }
                  //    if(model->rowCount()>0){
                  //        ui->lvwFile->setCurrentIndex(model->indexFromItem(model->item(0,0)));
                  //        connect(btnOK, SIGNAL(onClicked()), this, SLOT(on_btnOK_clicked()));
                  //    }
                  ShowIni();
                  //    ui->lblWaiting->setVisible(false);
              }
              void diaCloudFileList::setlsIcon(){
                  icon=QIcon(":/Icon/Resources/Icon/xxxFile.png");
                  for (int i=0; i<slFileName.count(); i++)
                  {
                      QString tmpFilePaht=slFileName[i];
                      QNetworkAccessManager *manager= new QNetworkAccessManager(this);
                      QUrl url("ftp://xxxx@xx.xx.xx.xx/xx"+tmpFilePaht+".jpg");
                      url.setUserName("xxx");
                      url.setPassword("xxx");
                      url.setPort(21);
                      QNetworkRequest request(url);
              
                      QNetworkReply* reply=manager->get(request);
                      reply->setProperty("idx", i);
                      connect(manager, SIGNAL(finished(QNetworkReply*)),
                              this, SLOT(replyIcon(QNetworkReply*)));
                  }
              }
              
              void diaCloudFileList::replyIcon(QNetworkReply *reply){
                  ui->lblWaiting->setText("replyIcon"+QString::number(this->lsIcon.count())+"/"+QString::number(this->slFileName.count()));//"Please wait.. Process Loading...""
              
                  QByteArray bytes=reply->readAll();
                  QImage image=QImage::fromData(bytes);
              
                  QPixmap sidebar_project_icon_Pixmap = sidebar_project_icon_Pixmap.fromImage(image);
                  icon = sidebar_project_icon_Pixmap;
                  this->lsIcon.push_back(icon);
                  int i = reply->property("idx").toInt();
                  this->lsIdx.push_back(i);
                  ui->lblWaiting->setText("Please wait.. Process Loading..."+QString::number(this->lsIcon.count())+"/"+QString::number(this->slFileName.count()));//"Please wait.. Process Loading...""
                  QModelIndex index = ui->lvwFile->model()->index(i,0);
                  ui->lvwFile->model()->setData(index,icon,init_styleditemdelegate_cell::IconRole);
                  if(this->lsIcon.count()==this->slFileName.count()){
                      ui->lblWaiting->setVisible(false);
                      ui->lblWaiting->setText("Please wait.. Process Loading...");
                      if(model->rowCount()>0){
                          ui->lvwFile->setCurrentIndex(model->indexFromItem(model->item(0,0)));
                          connect(btnOK, SIGNAL(onClicked()), this, SLOT(on_btnOK_clicked()));
                      }
                  }
                  //    if(this->lsIcon.count()==this->slFileName.count()){
                  //        QList<QIcon> tmpList=this->lsIcon;
                  //        for(int k=0;k<this->lsIcon.count();k++){
                  //            int curIdx=this->lsIdx[k];
                  //            this->lsIcon[curIdx]=tmpList[k];
                  //        }
                  //        BindLV();
                  //        ui->lblWaiting->setVisible(false);
                  //        ui->lblWaiting->setText("Please wait.. Process Loading...");
                  //    }
              }
              
              1 Reply Last reply
              0
              • P p3c0
                30 Jul 2015, 06:37

                @mkdh Which method ?

                M Offline
                M Offline
                mkdh
                wrote on 30 Jul 2015, 09:25 last edited by
                #10

                @p3c0
                that is my code.
                Do you have any suggestion for my code to improve?

                P 1 Reply Last reply 30 Jul 2015, 09:48
                0
                • M mkdh
                  30 Jul 2015, 09:25

                  @p3c0
                  that is my code.
                  Do you have any suggestion for my code to improve?

                  P Offline
                  P Offline
                  p3c0
                  Moderators
                  wrote on 30 Jul 2015, 09:48 last edited by
                  #11

                  @mkdh It's good that you switched back to async way :)
                  Hmm I find some places that can be improved:

                  • In replyIcon you are converting data to QImage and again back to QPixmap. I see you have never used image in that function. It would be better to convert it directly to QPixmap.
                  • In setlsIcon you have a for loop where you create those many QNetworkAccessManager objects but never delete it. That would cause a lots of memory leak. Sure you have passed this but those wont be deleted until parent gets deleted. Better to handle it in app's runtime. Same for init_styleditemdelegate_cell and others if any.
                  • In replyFinished you are concatenating bytes to str and then again splitting it. Wont directly split be possible ?

                  157

                  M 1 Reply Last reply 30 Jul 2015, 10:27
                  0
                  • P p3c0
                    30 Jul 2015, 09:48

                    @mkdh It's good that you switched back to async way :)
                    Hmm I find some places that can be improved:

                    • In replyIcon you are converting data to QImage and again back to QPixmap. I see you have never used image in that function. It would be better to convert it directly to QPixmap.
                    • In setlsIcon you have a for loop where you create those many QNetworkAccessManager objects but never delete it. That would cause a lots of memory leak. Sure you have passed this but those wont be deleted until parent gets deleted. Better to handle it in app's runtime. Same for init_styleditemdelegate_cell and others if any.
                    • In replyFinished you are concatenating bytes to str and then again splitting it. Wont directly split be possible ?
                    M Offline
                    M Offline
                    mkdh
                    wrote on 30 Jul 2015, 10:27 last edited by
                    #12

                    @p3c0
                    Thanks. ^_____^

                    P 1 Reply Last reply 30 Jul 2015, 10:35
                    0
                    • M mkdh
                      30 Jul 2015, 10:27

                      @p3c0
                      Thanks. ^_____^

                      P Offline
                      P Offline
                      p3c0
                      Moderators
                      wrote on 30 Jul 2015, 10:35 last edited by
                      #13

                      @mkdh You're Welcome :) Also please surround your code with ``` (3 backticks) while posting it here. It looks more nicer. I have now added those in your previous post. Happy Coding ...

                      157

                      1 Reply Last reply
                      0

                      13/13

                      30 Jul 2015, 10:35

                      • Login

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