2012-02-25 8 views
9

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

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.

Все виды советы приветствуются :)

+0

Возможно, что-нибудь о машинах, на которых вы хотите, чтобы это продолжалось. Использование связанного списка может быть умным в зависимости от целевых компьютеров. – EKS

+3

Возможно, я ошибаюсь, но, кажется, вы рисуете весь образ каждого события рисования. Вы можете нарисовать только часть изображения, которое вы сейчас показываете в окне просмотра. Это должно постоянно поддерживать процессор. – Masci

+0

@Masci: Обратите внимание на примечание «Автоматическое обрезание» в документах QPaintEvent: Qt делает это автоматически, и вам не нужно явно заполнять какое-либо условие отсечения QPaintEvent на ваш QPainter. – timday

ответ

1

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

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