2012-02-25 67 views
9

我有以下用戶界面,其中顯示聲譜圖(頻率+時間聲音表示)。所以圖像不是從某處加載的,它是在QPainter的同時讀取WAV文件。如何在窗口中有效地滾動1024x90000圖像?

The UI

我目前的實現是一個巨大的QImage對象中,當圖像繪製。而就paintEvent(),我畫了大QImage的一部分在widget:

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

但是,據我所知,在QPixmap被顯示在屏幕上的像素映射優化,所以我應該轉換QImageQPixmap後超聲波圖的繪製完成了嗎?

而且,它是值得保持大的圖像爲某種更小尺寸的獨立QPixmap對象的鏈表,並paintEvent()更聰明,以更小的物體,避免Qt的自動切割程序的列表上運行等等?

當我的QImage足夠大時,每個paintEvent()消耗大量CPU

各種建議,歡迎:)

+0

也許發佈一些關於你想運行的機器的東西。根據目標機器的不同,使用鏈表可能很智能。 – EKS 2012-02-26 16:42:33

+3

也許我錯了,但看起來你畫的每一個油漆事件的整個形象。您只能繪製當前在視口上顯示的圖像部分。這應該保持CPU消耗不變。 – Masci 2012-02-28 12:20:13

+0

@Masci:請參閱QPaintEvent文檔中的「自動裁剪」註釋:Qt自動執行此操作,並且不需要將任何QPaintEvent裁剪狀態明確複製到QPainter。 – timday 2012-02-28 23:19:21

回答

1

是的,在我有限的Qt應用程序開發的經驗,如果你有一個靜態圖像(或很少更新的圖像),它是(出於性能)創造了非常值得QPixmap,並在您的paintEvent處理程序中通過QPainter::drawPixmap保持使用。但是,我從來沒有嘗試過使用大於4Kx4K圖像的任何東西來做這件事,所以當你開始強調你的圖形記憶時,無論它是爲你的巨大圖像工作還是在可怕的情況下崩潰,我都說不出來。在考慮添加複雜的平鋪系統之前,我一定會嘗試一下。