Anche se una risposta è già stato scelto, vorrei esprimere il mio parere.
Non mi piace la risposta selezionata, soprattutto a causa dell'uso dei timer. Un timer per scaricare le pixmaps? Dite che l'utente vuole effettivamente dare una buona occhiata all'immagine, e dopo un paio di secondi - bam, l'immagine viene scaricata, dovrà fare qualcosa in modo che l'immagine riappaia. Oppure potresti mettere un altro timer, che carica le pixmap dopo un altro paio di secondi? O controllerai tra i tuoi mille oggetti se sono visibili? Non solo è molto irritante e sbagliato, ma significa che il tuo programma userà sempre risorse.Supponiamo che l'utente minimizzi il programma e riproduca un film, si chiederà perché diavolo il mio film si blocca ogni paio di secondi ...
Bene, se ho frainteso l'idea proposta di usare i timer, eseguimi.
In realtà l'idea suggerita da mmutz è migliore. Mi ha ricordato lo Mandelbrot example. Dai un'occhiata a questo. Invece di calcolare cosa disegnare, puoi riscrivere questa parte per caricare quella parte dell'immagine che devi mostrare.
In conclusione vi proporrò un'altra soluzione utilizzando QGraphicsView in un modo molto più semplice:
1) controllare le dimensioni dell'immagine senza caricare l'immagine (utilizzare QImageReader)
2) fare il formato del vostro scena uguale a quello dell'immagine
3) invece di utilizzare elementi pixmap reimplementare la funzione DrawBackground(). Uno dei parametri ti darà il nuovo rettangolo esposto - il che significa che se l'utente scorre solo un po ', caricerai e disegnerai solo questa nuova parte (per caricare solo parte di un'immagine usa i metodi setClipRect() e read() della classe QImageReader). Se ci sono delle trasformazioni puoi ottenerle dall'altra parametro (che è QPainter) e applicarle all'immagine prima di disegnarla.
A mio parere la soluzione migliore sarà combinare la mia soluzione con la filettatura mostrata nello Mandelbrot example.
L'unico problema a cui riesco a pensare ora è se l'utente ingrandisce con un fattore di scala elevato. Quindi avrai bisogno di un sacco di risorse per un po 'di tempo per caricare e ridimensionare un'immagine enorme. Bene, ora vedo che c'è una funzione del QImageReader che non ho ancora provato - setScaledSize(), che forse fa proprio quello di cui abbiamo bisogno - se imposti una dimensione di scala e poi carichi l'immagine forse non verrà caricata prima l'intera immagine - provalo. Un altro modo è solo per limitare il fattore di scala, una cosa che dovresti fare comunque se ti attieni al metodo con gli oggetti pixmap.
Spero che questo aiuti.
Questo è fantastico. Salverebbe un sacco di lavoro. Mi stavo chiedendo se sarebbe stato lento o balbettante durante lo scorrimento. Quello che avevo inizialmente programmato era quello di tenere traccia di ciò che l'utente sta visualizzando usando l'evento mouse e scrollbar e quindi caricare le tessere circostanti e posizionarle sulla scena in anticipo usando un thread separato. Mentre l'utente si muove attraverso la scena, il thread in background semplicemente carica e scarica le tessere di conseguenza. QGraphicsItem dipinge già in background? –
Se volevi caricare in un thread separato dovresti inviare un segnale dal tuo evento paint a un thread worker invece di caricare l'immagine, e poi ogni volta che paint viene chiamato traccia una specie di immagine vuota finché il thread non lo ha caricato . Potresti * restituire una dimensione più grande di quella effettiva per 'boundingRect()' per attivare gli eventi di disegno prima che le tessere siano effettivamente visibili. Ma questo potrebbe avere altri effetti collaterali se non stai attento. – James
Grazie, sei stato di grande aiuto. Ho ottenuto il caricamento delle mattonelle quasi finito. Ora qual è il modo migliore per scaricare le tessere. Da quanto ho capito dal tuo post precedente, hai suggerito di eseguire un timer che distrugge ogni PixmapItem nella scena e lo imposta su NULL ogni pochi secondi. E poiché il metodo paint viene chiamato per ogni aggiornamento, ripristinerebbe automaticamente le tessere che sono attualmente visualizzate. Ho ragione? –