2012-02-25 12 views
9

Mam następujący interfejs użytkownika, w którym pokazano sonogram (freq + czas reprezentacja dźwięku). Dlatego obraz nie jest ładowany skądś, jest rysowany przez QPainter podczas odczytu pliku WAV.Jak skutecznie przewijać obraz 1024x90000 w oknie?

The UI

Moja obecna implementacja jest jeden ogromny QImage obiektu, gdzie obraz jest rysowany. I na paintEvent(), rysuję częścią dużego QImage na widget:

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

Ale, jak wiadomo, QPixmap jest zoptymalizowany do wyświetlania mapy pikseli na ekranie, dlatego należy przekonwertować QImage do QPixmap po rysunek sonogramu jest zrobiony?

Czy warto zachować duży obraz jako oddzielną listę oddzielnych obiektów QPixmap o mniejszym rozmiarze i sprawić, że paintEvent() będzie inteligentniej działać na liście mniejszych obiektów, aby uniknąć procedur automatycznego cięcia Qt i tak dalej?

Gdy mój obraz QImage jest wystarczająco duży, każdy z nich zajmuje paintEvent(), pobierając dużo z CPU.

Wszelkiego rodzaju porady są mile widziane :)

+0

Być może opublikuj coś o maszynach, na których chcesz, aby to działało. Używanie połączonej listy może być inteligentne w zależności od komputerów docelowych. – EKS

+3

Może się mylę, ale wygląda na to, że rysujesz cały obraz podczas każdego wydarzenia z farbą. Możesz pomalować tylko fragment obrazu, który aktualnie wyświetlasz w oknie roboczym. To powinno utrzymywać zużycie procesora na stałym poziomie. – Masci

+0

@Masci: Zobacz notatkę "Automatycznego obcinania" w dokumentach QPaintEvent: Qt robi to automatycznie i nie musisz explicite kopiować żadnego stanu przycinania QPaintEvent do swojego QPaintera. – timday

Odpowiedz

1

Tak, w moim ograniczonym doświadczeniu Qt rozwoju aplikacji, jeśli masz obraz statyczny (lub rzadko zaktualizowanego obrazu) to warto (dla celów wydajności) tworząc QPixmap od niego i przechowywanie go do użytku za pośrednictwem QPainter::drawPixmap w twoim handlerze paintEvent.

Jednak nigdy nie próbowałem robić tego z obrazami większymi niż około 4Kx4K, więc bez względu na to, czy zadziała to dla twojego ogromnego obrazu, czy też strasznie upadnie, gdy zaczniesz podkreślać pamięć graficzną, nie mogę powiedzieć. Z pewnością wypróbuję to przed rozważeniem dodania skomplikowanego systemu układania płytek.

Powiązane problemy