Как эффективно прокрутить изображение 1024x90000 в окне? - PullRequest
9 голосов
/ 25 февраля 2012

У меня есть следующий пользовательский интерфейс, где показана сонограмма (Freq + время звукового представления). Таким образом, изображение откуда-то не загружается, оно рисуется QPainter при чтении файла WAV.

The UI

Моя текущая реализация представляет собой один огромный QImage объект, где рисуется изображение. И на paintEvent() я рисую часть большого QImage на виджете:

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

Но, как я знаю, QPixmap оптимизирован для отображения растровых изображений на экране, поэтому я должен преобразовать QImage в QPixmap после завершения рисования сонограммы?

Кроме того, стоит ли сохранять большое изображение в виде некоего связанного списка отдельных QPixmap объектов меньшего размера и сделать paintEvent() умнее для работы со списком более мелких объектов, чтобы избежать процедур автоматического вырезания в Qt и и так далее?

Когда мой QImage достаточно велик, каждый paintEvent() потребляет много CPU.

Приветствуются всевозможные советы:)

1 Ответ

1 голос
/ 29 февраля 2012

Да, в моем ограниченном опыте разработки приложений на Qt, если у вас есть статическое изображение (или редко обновляемое изображение), стоит (в целях повышения производительности) создать из него QPixmap и сохранить его для использования через QPainter::drawPixmap в вашем paintEvent обработчике.

Тем не менее, я никогда не пытался делать это с чем-то большим, чем с изображениями размером 4Kx4K, поэтому я не могу сказать, сработает ли оно для вашего огромного изображения или ужасно упадет, когда вы начнете напрягать свою графическую память. Я бы, конечно, попробовал это, прежде чем рассмотреть возможность добавления сложной системы листов.

...