Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. Lazy Loading para uma QScrollArea
Forum Updated to NodeBB v4.3 + New Features

Lazy Loading para uma QScrollArea

Scheduled Pinned Locked Moved Solved Portuguese
5 Posts 2 Posters 2.0k Views
  • 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.
  • GugadozeroG Offline
    GugadozeroG Offline
    Gugadozero
    wrote on last edited by Gugadozero
    #1

    Estou fazendo um leitor de pdf utilizando a biblioteca poppler, basicamente o funcionamento é pegar cada página e renderizar em um QImage, essas imagens serão adicionadas a um layout, que por sua vez seria adicionado a uma inner widget de um QScrollArea, O código de testes está logo abaixo:

    #include "mainwindow.h"
    #include <QApplication>
    #include <QLabel>
    #include <QGridLayout>
    #include <QWidget>
    #include <QScrollArea>
    #include <QScrollBar>
    #include <QDebug>
    
    #include <poppler/qt5/poppler-qt5.h>
    
    
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
    
    
    
        QString filename = "/home/gustavo/Downloads/notas-2015.2.pdf";
        Poppler::Document* document = Poppler::Document::load(filename);
        if (!document || document->isLocked()) {
         // ... error message ....
         delete document;
         return 1;
        }
    
        // Paranoid safety check
        if (document == 0) {
          // ... error message ...
          return 1;
        }
    
        QScrollArea *scrollArea = new QScrollArea;
        QWidget *scrollWidget = new QWidget;
    
        scrollWidget->setLayout(new QGridLayout);
        scrollArea->setWidget(scrollWidget);
        
        int numPages = document->numPages();
    
        
        
        for(int i = 0; i < numPages; ++i)
        {
            Poppler::Page* pdfPage = document->page(i);  
            if (pdfPage == 0) {
    
             return 1;
             }
    
    
             QImage image = pdfPage->renderToImage(200,200,-1,-1,-1,-1);
            if (image.isNull()) {
                // ... error message ...
               return 1;
          }
    
    
             QLabel *label = new QLabel;
             label->setPixmap(QPixmap::fromImage(image));
             label->setAlignment( Qt::AlignCenter );
    
             scrollWidget->layout()->addWidget(label);
    
             delete pdfPage;
        }
    
        scrollArea->setWidgetResizable(true);
        w.setCentralWidget(scrollArea);
    
    
    
    
        w.show();
    
        delete document;
    
        return a.exec();
    }
    ```
    ```
    
    Mas tem um problema, se o pdf for muito grande, ele vai simplismente travar o computador, devido ao grande consumo de memória, já que vou carregar todas as páginas de uma vez na tela. Como eu faria um lazy loading com issoCaso não seja possível, como eu carregaria ao longo que o usuário desce o scroll?
    1 Reply Last reply
    0
    • T Offline
      T Offline
      TioRoy
      wrote on last edited by
      #2

      Você pode usar um QFutureWatcher, que faz parte do pacote Qt Concurrent.

      Você vai fazer a função que transforma o PDF em imagens, e em vez de chamar diretamente, vai usar o QFutureWatcher para saber que acabou através do slot handleFinished(), como está no exemplo (e abaixo).

      // Instantiate the objects and connect to the finished signal.
      MyClass myObject;
      QFutureWatcher<int> watcher;
      connect(&watcher, SIGNAL(finished()), &myObject, SLOT(handleFinished()));
      
      // Start the computation.
      QFuture<int> future = QtConcurrent::run(pdf2image, QString("pdf?"));
      watcher.setFuture(future);
      
      1 Reply Last reply
      0
      • T Offline
        T Offline
        TioRoy
        wrote on last edited by
        #3

        Aqui tem um exemplo do Qt Concurrent

        GugadozeroG 1 Reply Last reply
        0
        • T TioRoy

          Aqui tem um exemplo do Qt Concurrent

          GugadozeroG Offline
          GugadozeroG Offline
          Gugadozero
          wrote on last edited by
          #4

          @TioRoy Obrigado, serviu aqui!

          T 1 Reply Last reply
          0
          • GugadozeroG Gugadozero

            @TioRoy Obrigado, serviu aqui!

            T Offline
            T Offline
            TioRoy
            wrote on last edited by
            #5

            Depois altera o título do post para 'SOLVED' :)

            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