前言
繼上篇文章(Simple bar chart)推出之後,本篇文章繼續ChartDirector的使用。在這篇Blog中,博主實現的是soft lighting bar。soft lighting bar是在一個XYChart中具備多個Bar的圖表,每一個Bar具有柔和光影效果(soft lighting)。在Bar chart大類中,還有glass lighting效果,也是在Bar的光影上面做功夫。這種效果主要是通過在新增圖層(BarLayer)時,傳遞不同的引數實現。使用者通過在設定皮膚進行配置,可以實現輸出不同色調和格式的圖表。
效果圖
(圖一) 整體介面
(圖二) 設定圖表的背景色和柵格顏色
(圖三) 選擇圖表檔案儲存路徑及格式(僅支援bmp,jpg,png,gif格式)
(圖四) 儲存完成,提示儲存路徑
(圖五)由上述配置生成的圖表
關鍵程式碼
在Qt中使用ChartDirector,配置好工程屬性並拷貝相應的庫檔案到工程目錄下。以下以繪圖程式碼為主進行分析:
1 //Y軸資料 2 const double data[] = {450, 560, 630, 800, 1100, 1350, 1600, 1950, 2300, 2700}; 3 //X軸標記 4 const char* lbs[] = {"1996", "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005"}; 5 //給圖表新增標題,該標題繪製於PlotArea區域以外。指定文字內容的時候,我們還需要指定文字字型,以及字型大小。 6 //在windows XP系統的C:\WINDOWS\Fonts下,可以檢視系統所帶字型庫。 7 c->addTitle(msg.mainTitle.c_str(), "timesbi.ttf", 18); 8 // 設定PlotArea區域,setPlotArea()函式所帶引數較多,在這裡我們可以設定PlotArea區域的大小以及在Chart畫布中的位置。 9 // 前面四個引數設定PlotArea區域在XYChart繪圖座標中的位置及大小,最後的兩個引數指定水平、垂直柵格線的顏色。 10 // XYChart的linearGradientColor()可以用於設定PlotArea區域的漸變色,前面四個引數指定漸變區域,後面的兩個顏色值指定 11 // 顏色漸變範圍。 12 c->setPlotArea(50, 40, 340, 250, 13 c->linearGradientColor(30, 20, 30, 290, msg.bgColor, 0x000000), 14 -1, 15 0xffffff, 16 msg.gridColor, 17 msg.gridColor); 18 // 新增一個圖層BarLayer。在這個圖層中,我們使用了IntArray(0, 0)來指定Bars的顏色值。也就是說,我們並沒有指定Bar的顏色。 19 // 在這種情況下,ChartDirector會自動從預設調色盤中依次選擇顏色來填充Bars。 20 // 在這裡我們呼叫了setBorderColor()來設定soft lighting效果。根據不同的值:Left, Right,光影出現在bars的不同側。 21 c->addBarLayer(DoubleArray(data, (int)(sizeof(data)/sizeof(data[0]))), 22 IntArray(0, 0))->setBorderColor(Chart::Transparent, Chart::softLighting(msg.lightDirection)); 23 // 設定X軸標記 24 c->xAxis()->setLabels(StringArray(lbs, (int)(sizeof(lbs)/sizeof(lbs[0])))); 25 // 設定X軸的標記位移。 26 c->xAxis()->setTickOffset(0.5); 27 // 設定X, Y軸的標題說明的字型和字型大小 28 c->xAxis()->setTitle(msg.xTitle.c_str(), "timesbi.ttf", 8); 29 c->yAxis()->setTitle(msg.yTitle.c_str(), "timesbi.ttf", 8); 30 // 設定X, Y軸軸線的寬度,這裡為2個畫素寬。 31 c->xAxis()->setWidth(2); 32 c->yAxis()->setWidth(2);
小結
- Chart繪圖區域和PlotArea大小要區分清楚:Chart繪圖區域是整個畫布的大小,所有後續的繪圖操作都在這張畫布上進行操作,包括XY座標區域,XY座標軸標誌、名稱等資料。Chart區域大小在生成XYChart物件的時候指定;PlotArea物件在前面已經說過了,針對於XYChart才有意義。在XYChart中,PlotArea代表的區域是由X, Y軸形成的矩形區域,不包括X, Y軸的標記、名稱以及圖表標題。所有的圖層(Layer)也是覆蓋在PlotArea上面進行操作的。
- ChartDirector支援的圖片檔案格式包括png, jpg, jpeg, gif, bmp, SVG等。其中SVG格式需要在生成圖表檔案之前,呼叫BaseChart.enableVectorOutput進行設定。