文章首發自公衆號:: nullobject 。
個人站點:https://www.nullobject.cn
這篇文章主要講解QValueAxis類的API及其使用。
0x00 關於QValueAxis
QValueAxis
,即數值軸,適用於具有連續數據座標的圖表。QValueAxis作爲QAbstractAxis的實現類之一,
在繼承了QAbstractAxis特性的同時,根據數值軸的特點封裝實現了許多方便實用的功能。QValueAxis使用起來也非常簡單,在上一篇文章QAbstractAxis中的示例代碼均是使用QValueAxis實例來說明的。本文主要介紹QValueAxis實現的功能。
QValueAxis使用示例:
#include <QApplication>
#include <QChartView>
#include <QLineSeries>
#include <QValueAxis>
#include <QDebug>
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 創建QChartView對象
QChartView *chartView = new QChartView;
chartView->setRenderHint(QPainter::Antialiasing);
// 創建序列
QLineSeries *series = new QLineSeries();
// 隱藏圖例
chartView->chart()->legend()->hide();
// 添加數據
series->append(0,2);
series->append(QPointF(2,6));
series->append(3,8);
series->append(7,9);
series->append(11,3);
*series << QPointF(11,2) << QPointF(15,5) << QPointF(18,4) << QPointF(19,2);
// 添加序列到圖表
chartView->chart()->addSeries(series);
// 創建X軸
QValueAxis *axisX = new QValueAxis;
// 設置QValueAxis屬性
axisX->setRange(10, 20.5);
axisX->setTickCount(5);
axisX->setLabelFormat("%.2f");
chartView->chart()->setAxisX(axisX, series);
// 創建Y軸
QValueAxis *axisY = new QValueAxis;
axisY->setRange(0, 10);
axisY->setTickCount(5);
axisY->setLabelFormat("%.2f");
chartView->chart()->setAxisY(axisY, series);
chartView->resize(400,300);
chartView->show();
return a.exec();
}
效果:
0x01 設置刻度線
在Qt 5.12版本之前,QValueAxis只支持固定的刻度線設置,只能通過setTickCount
設置刻度線的數量,刻度線會平均分佈在座標軸。而在Qt最新版本5.12版中,QValueAxis支持通過tickType
屬性來設置刻度線爲固定分佈(TicksFixed)或者是動態分佈(TicksDynamic)。
- QValueAxis::TickType tickType:設置刻度類型
QValueAxis::TickType tickType() const;
void setTickType(QValueAxis::TickType type);
其中TickType爲QValueAxis中聲明的用於描述刻度類型(刻度線和刻度標籤在軸上的位置)的枚舉類:
enum TickType {
TicksDynamic = 0,
TicksFixed
};
tickType屬性改變時觸發
tickTypeChanged(QValueAxis::TickType)
信號
- TicksFixed 設置刻度位置爲均勻分佈
QValueAxis默認的刻度類型爲TicksFixed。將刻度類型設置爲TicksFixed,可以通過設置tickCount屬性值來指定刻度線的數量,此時刻度線會被均勻地地分佈在座標軸上。默認的刻度線數量是5條,最低數量不能低於2。:
axisY->setRange(0, 10);
axisY->setTickType(QValueAxis::TickType::TicksFixed);
axisY->setTickCount(6);
效果:
其中tickCount的操作函數聲明如下:
int tickCount() const;
void setTickCount(int count);
tickCount屬性修改只在tickType值爲TicksFixed時有效。
tickCount屬性改變時觸發
tickCountChanged(int)
信號。
- TicksDynamic 設置刻度位置爲動態分佈
動態設置刻度的位置,需要通過設置錨點tickAnchor和刻度間距tickInterval屬性值來實現,必須要設置指定tickInterval纔有效果:
axisY->setRange(0, 10);
axisY->setTickType(QValueAxis::TickType::TicksDynamic);
// 設置刻度間距爲3
axisY->setTickInterval(3);
// 設置錨點座標爲5
axisY->setTickAnchor(5);
效果:
其中錨點tickAnchor屬性用於指定刻度線和標籤開始繪製的位置,刻度間距tickInterval屬性用於指定刻度與刻度之間的距離。上示例子中將tickAnchor和tickInterval分別設置爲5和3,表示刻度將從座標爲5的位置開始,向軸兩端分佈,如果不顯示設置tickAnchor,則默認從座標軸的起始位置開始分佈;tickInterval的類型爲qreal
類型,支持設置刻度間隔爲小數。
修改tickAnchor和tickInterval對應會觸發的信號分別爲:
tickAnchorChanged(int)
和tickIntervalChanged(qreal)
。
0x02 設置座標軸顯示範圍
QValueAxis通過max
和min
兩個屬性來表示座標軸的最大和最小值,可以通過調用對應的方法來設置座標軸的顯示範圍。
- qreal max:設置座標軸最大值
qreal max() const;
void setMax(qreal max);
max屬性修改會觸發
maxChanged(qreal)
信號。
- qreal min:設置座標軸最小值
qreal min() const;
void setMin(qreal min);
min屬性修改會觸發
minChanged(qreal)
信號。
- setRange:設置座標軸顯示範圍
void setRange(qreal min, qreal max);
除了可以調用setMax
或setMin
單獨設置座標軸的極值外,也可以直接調用setRange
同時設置座標軸的最大、最小值:
// axisY->setMin(0);
// axisY->setMax(10);
// 等價於setRange(0,10);
axisY->setRange(0, 10);
當座標軸的最大值
max
或者最小值min
發生改變時,都會觸發rangeChanged(qreal min,qreal max)
信號。
0x03 設置刻度標籤顯示格式
QValueAxis座標軸支持通過labelFormat
屬性設置標籤的顯示格式,例如指定顯示小數位數等。
- **QString labelFormat:**設置標籤格式
QString labelFormat() const;
void setLabelFormat(const QString &format);
其中傳參format爲需要指定的字符串格式,例如設置爲顯示小數點後兩位數:
axisX->setLabelFormat("%.2f");
目前labelFormat支持設置以下轉換說明符、長度修飾符以及標準C++庫中printf()
函數提供的格式標誌:d, i, o, x, X, f, F, e, E, g, G, c。具體使用可以百度搜索瞭解:printf() 輸出格式。
修改該屬性會觸發
labelFormatChanged(const QString&)
信號。