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?
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 :)
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
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
@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