2012-02-25 13 views
9

Ho la seguente UI, in cui è mostrato il sonogramma (freq + rappresentazione del suono orario). Quindi l'immagine non viene caricata da qualche parte, viene disegnata da QPainter durante la lettura del file WAV.Come far scorrere efficacemente l'immagine 1024x90000 in una finestra?

The UI

Il mio attuale implementazione è un unico enorme QImage oggetto, in cui viene disegnato l'immagine. E su paintEvent(), ne traggo parte del grande QImage sul widget:

QPainter painter(this); 
// (int, int, QImage*, int, int) 
painter.drawImage(0, 0, *m_sonogram, 0, m_offset); 

Ma, che io sappia, il QPixmap è ottimizzato per la visualizzazione di mappe di pixel sullo schermo, quindi dovrei convertire il QImage ad un QPixmap dopo la il disegno dell'ecografia è fatto?

Inoltre, vale la pena di mantenere grande immagine come una sorta di una lista concatenata di separati QPixmap oggetti di dimensioni più piccole e fare paintEvent() più intelligente di operare su un elenco di oggetti più piccoli per evitare le procedure di auto-taglio di Qt e così via?

Quando il mio QImage è sufficientemente grande, ogni paintEvent() consuma molto CPU.

Tutti i tipi di consigli sono i benvenuti :)

+0

Forse postare qualcosa sulle macchine su cui si vuole che questo venga eseguito. L'uso dell'elenco collegato potrebbe essere intelligente a seconda delle macchine di destinazione. – EKS

+3

Forse mi sbaglio, ma sembra che tu abbia disegnato l'intera immagine ogni evento pittorico. Puoi dipingere solo la parte dell'immagine che stai visualizzando sul viewport. Questo dovrebbe mantenere costante il consumo di CPU. – Masci

+0

@Masci: consultare la nota "Clipping automatico" nei documenti di QPaintEvent: Qt esegue questa operazione automaticamente e non è necessario copiare esplicitamente alcuno stato di ritaglio QPaintEvent sul QPainter. – timday

risposta

1

Sì, nella mia limitata esperienza di Qt sviluppo di app, se si dispone di un'immagine statica (o un'immagine raramente aggiornata) ne è valsa la pena (per il calcolo delle prestazioni) la creazione di un QPixmap da esso e tenerlo in giro per utilizzare tramite QPainter::drawPixmap nel gestore paintEvent.

Tuttavia, non ho mai provato a farlo con qualcosa di più grande rispetto alle immagini 4Kx4K, quindi se funzionerà per la tua enorme immagine o cadrà in modo orribile quando inizi a stressare la tua memoria grafica non potrei dire. Sicuramente proverei prima di considerare l'aggiunta di un complicato sistema di piastrellatura.

Problemi correlati