2017-09-01 184 views
0

我正在構建一個應用程序,繪製使用QtCharts庫的測量數據。一些重要的事情,應該提及的是:如何強制QChartView僅繪製其本身的一部分

  1. 我正在處理時間序列。

  2. 測量數據離線獲取,這意味着它已經獲得。我的程序只是從文件中讀取並顯示它。

  3. 我正在使用for循環,它將數據點視爲固定大小(比如10000)的塊,並將它們添加到分散系列中。通過這種方式,數據被「重播」,用戶可以在許多中間時間點看到測量數據的進展,而不是在繪製完所有數據點之後。

  4. 我正在處理大量的數據點,數以百萬計。

在創建一個新的QScatterSeries循環的每次迭代,數據點被追加,散射系列被添加到圖表,然後圖表視圖重新繪製。一開始它的速度非常快,但隨着時間的推移,塗漆點的數量增加,塗裝過程變得越來越慢。 我知道一個事實,我可以重新實現圖表視圖類的paintEvent來讓它只重繪本身的一部分。我想我可以通過只更新具有新數據點的部分來加快速度。我將只計算添加新數據點的區域的座標,並使用paintEvent。但我該怎麼做?我嘗試使用QPainter的setClipRect()方法,但不能這樣做。提前致謝。

回答

0

QGraphicsView/QGraphicsItem不實施它。

他們不這樣做,因爲不幸的是,通常不可能:顯示的項目(例如系列)被縮放和反鋸齒。在過去,當所有事情都以設備單位顯示,並直接在窗口上繪製時,部分更新是有意義的:您首先使用快速blit來移動現有繪圖,然後繪製新點。在任何非平凡的場景查看器中,水平設備(小工具)單位和項目(圖表/系列)單位之間的關係不是1:1,所以沒有通用的方法來滾動設備中的數據單位,並在圖表單位仍然有意義。

有一種解決方法:滾動某些大於需要(向上舍入)的設備單位數,然後計算以圖表爲單位生成的滾動數據,然後用這樣的數字(即相應地移動X軸範圍)。

這可以在QGraphicsView系統的源代碼中相對容易實現,如圖表上的內容所示。沒有辦法在外部「將此插入」 - 您需要直接將此類支持添加到QGraphicsViewQGraphicsItem基礎架構,然後讓QChartView利用它。如果你不習慣構建自己的Qt,那麼你當然可以將必要的類複製到你的代碼庫並重命名它們。

+0

首先,感謝您的回覆。可能有些事情我不能說得很清楚。首先,由於所有數據點在開始時都可用,因此我將首先爲這兩個座標找到這些點的最小值和最大值,然後將軸的範圍設置爲這些值。這樣,就不需要重新調整軸的尺寸。另外,不需要重新繪製已經在圖表上的點,因爲它們的位置不會改變。新的數據點將被放置在以前空白的區域。所以我只想給這個地區的位置 –

+0

這是可行的,但仍需要對Qt代碼進行修改。 –