1. 程式人生 > 程式設計 >Qt圖形影象開發之曲線圖表模組QChart庫讀取/設定X軸的顯示區間

Qt圖形影象開發之曲線圖表模組QChart庫讀取/設定X軸的顯示區間

設定初始的顯示的區間,常用的有兩種方法

(1)自動

lineseries = new QLineSeries();//宣告折線資料集
lineseries->append(4,10); //填充資料集
*lineseries << QPointF(13,5) << QPointF(17,6);
 
lineChart = new QChart();//建立圖表
lineChart->addSeries(lineseries); // 將 資料集 新增至圖表中
lineChart->createDefaultAxes();//根據資料集,自動建立座標軸,座標軸的區間恰好完全容納已有的資料集
//lineChart->axisX()->setRange(0,45);//也可隨時手動調節要顯示的座標區間

(2)手動指定要顯示的區間(注意,軸變數如axisX一定要是靜態的/動態new/malloc的.r如果宣告成了區域性臨時變數,變數一旦出棧後,軸就不顯示了)

lineseries = new QLineSeries();//宣告折線資料系列
lineseries->append(4,6);
 
lineChart = new QChart();//建立圖表
lineChart->addSeries(lineseries); // 將 資料集 新增至圖表中
 
QValueAxis *axisX = new QValueAxis();//軸變數、資料系列變數,都不能宣告為區域性臨時變數
QValueAxis *axisY = new QValueAxis();//建立X/Y軸
axisX->setRange(0,100);
axisY->setRange(-5,5);//設定X/Y顯示的區間
lineChart->setAxisX(axisX);
lineChart->setAxisY(axisY);//設定chart的座標軸
lineseries->attachAxis(axisX);//連線資料集與座標軸。特別注意:如果不連線,那麼座標軸和資料集的尺度就不相同,顯示

下面才是重點!

前面講的是,設定初始的顯示區間,那麼如何在程式中實時的修改顯示的區間呢?

任務描述:把當前的圖形沿X軸放大2倍,Y軸不放縮。

解決方案:任務要求X放大兩倍,也即把X的顯示區間縮小為原先的1/2,也即,我們必須首先得到當前的顯示區間才行。難點來了:lineChart->axisX(pSeries)的返回值是QAbstractAxis型別,這個型別並沒有提供座標軸區間的min和max成員變數,也沒有提供getMin和getMax方法。

由以上程式可知,不同型別的chart,座標軸axis的型別也是不同的,在void QChart::createDefaultAxes()的幫助中有:

Qt圖形影象開發之曲線圖表模組QChart庫讀取/設定X軸的顯示區間

XY圖(折線圖、曲線圖)、條形圖、餅圖座標軸型別都是不同的,但他們都繼承了QAbstractAxis。

折線圖的座標軸的型別為QValueAxis或者QDateTimeAxis,這兩個類是有min和max成員的,這樣解決方法就有了,我們非常確信的知道,lineChart->axisX(pLineSeries)的返回值型別雖然是QAbstractAxis,但其本質肯定是QValueAxis或者QDateTimeAxis,如果程式設計師心裡清楚軸的型別,就可以大膽的進行轉換,這一轉換肯定是安全的。

QValueAxis *axisX = (QValueAxis*)(lineChart->axisX(pLineSeries));//父類轉子類
 
int interval_len = axisX->max() - axisX->min();//求當前的區間長度
lineChart->axisX()->setRange(axisX->min(),axisX->min() + interval_len/2);//區間縮小1/2=影象放大2倍

如果擔心轉換的安全性,也可以用動態轉換:

QValueAxis *axisX = dynamic_cast<QValueAxis*>(lineChart->axisX(pLineSeries));
if(NULL == axisY)
{
 qDebug() << "轉換失敗,lineChart->axisX()的記憶體內容根本不是QValueAxis型別或者QValueAxis的子類";
}
 
QDateTimeAxis *axisDataX = dynamic_cast<QDateTimeAxis *>(lineChart->axisX(pLineSeries));
{
 qDebug() << "轉換失敗,軸型別不是QDateTimeAxis或者其子類";
}

本文介紹了Qt曲線圖表模組QChart庫讀取/設定X軸的顯示區間,更多關於Qt曲線圖表模組QChart庫的知識請檢視下面的相關連結