C++ Qt開發:Charts折線圖繪製詳解

来源:https://www.cnblogs.com/LyShark/archive/2023/12/23/17923208.html
-Advertisement-
Play Games

Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`QCharts`折線圖的常用方法及靈活運用。折線圖(Line Chart)是一種常用的數據可視化圖表,用於展示隨... ...


Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹QCharts折線圖的常用方法及靈活運用。

折線圖(Line Chart)是一種常用的數據可視化圖表,用於展示隨著時間、類別或其他有序變數而變化的趨勢。折線圖通過將數據點連接起來形成折線,直觀地展示了變數之間的趨勢和關係。

折線圖通常用於以下環境:

  1. 時間序列數據: 顯示隨時間變化的數據趨勢,例如股票價格、氣溫變化等。
  2. 比較趨勢: 可以比較不同組之間的趨勢,例如不同產品的銷售趨勢。
  3. 展示模式或關聯關係: 用於顯示變數之間的相關性或模式,例如銷售額和廣告投入之間的關係。

折線圖的基本結構包括:

  • 橫軸(X軸): 通常表示時間或類別。
  • 縱軸(Y軸): 表示變數的值。可以是數值,也可以是百分比或其他度量。
  • 數據點: 在圖表上表示具體的數據值的點。
  • 折線: 將數據點連接起來的線,形成變化趨勢。

在Qt中,可以使用圖表庫來創建折線圖。通過在程式中添加相應的數據點,並設置合適的軸和樣式,你可以輕鬆創建出漂亮且具有信息表達能力的折線圖。

在之前的文章中筆者簡單創建了一個折線圖,由於之前的文章只是一個概述其目的是用於讓讀者理解繪圖組件是如何被引用到項目中的,以及如何實際使用,本章我們將具體分析折線圖的繪製功能,詳細介紹圖表各個部分的設置和操作,包括圖標的標題、圖例、邊距等屬性的設置,QLineSeries序列的屬性設置,QValueAxis坐標軸的屬性設置等,通過本章的學習讀者可以掌握QChart繪圖的核心方法。

1.1 圖表設置

1.1.1 設置標題

首先我們來實現對圖表的設置,通常情況下圖表中的標題可以通過setTitle來設置,而通過setTitleFont可以設置標題字體,通常設置字體需要使用QFont類,以下是 QFont 類中常用的方法的說明和概述:

方法 描述
QFont() 預設構造函數,創建一個預設字體。
QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false) 帶參數的構造函數,創建一個具有指定族、大小、粗細和斜體屬性的字體。
QString family() const 返回字體的族(family)。
void setFamily(const QString &family) 設置字體的族。
int pointSize() const 返回字體的大小(以點為單位)。
void setPointSize(int pointSize) 設置字體的大小。
int weight() const 返回字體的粗細。
void setWeight(int weight) 設置字體的粗細。
bool italic() const 返回字體是否為斜體。
void setItalic(bool italic) 設置字體是否為斜體。
QString styleName() const 返回字體的樣式名稱。
void setStyleName(const QString &styleName) 設置字體的樣式名稱。
bool bold() const 返回字體是否為粗體。
void setBold(bool enable) 設置字體是否為粗體。
bool exactMatch() const 檢查字體是否與指定的字體精確匹配。
QFontMetrics metrics() const 返回字體的度量信息,如字元高度、寬度等。
bool operator==(const QFont &other) const 比較兩個字體是否相等。
bool operator!=(const QFont &other) const 比較兩個字體是否不相等。
QFont &operator=(const QFont &font) 重載賦值運算符,用於將一個字體的值賦給另一個字體。

這些方法允許你設置和獲取字體的各種屬性,如族、大小、粗細、斜體等。你可以使用這些方法來創建和調整字體,以滿足應用程式的設計需求。

通過創建一個 QFont 對象 titleFont,然後設置字體的家族、大小和粗細。最後,通過 setTitleFont 方法將這個字體應用到圖表的標題上,具體實現代碼如下所示;

// 設置頂部標題
chart->setTitle("系統性能統計圖");

// 設置字體
QFont titleFont;
titleFont.setFamily("Arial");
titleFont.setPointSize(25);
titleFont.setBold(true);

// 設置圖表標題的字體
chart->setTitleFont(titleFont);

你可以根據需要調整字體的其他屬性,例如設置斜體、下劃線等。調整 setFamilysetPointSizesetBold 等方法的參數,則用於控制這三個屬性,當然如果不希望出現頂部提示則可以忽略設置setTitle屬性;

1.1.2 圖表主題

圖表主題的選擇可以通過setTheme屬性設置,在Qt中預設支持的主題有8種可以選擇,通過使用不同的屬性可以設置不同的樣式表或主題,以影響應用程式的外觀和感覺。

  • Light(亮): 一種明亮的主題或樣式,通常背景顏色較淺,前景顏色較深,使得界面看起來清晰明瞭。
  • BlueCerulean(藍天藍): 一個以藍色為主調的主題,可能會給應用程式帶來清新和現代的感覺。
  • Dark(暗): 一種較暗的主題,背景顏色可能較深,前景顏色相應較亮。適合創建更為暗調的用戶界面。
  • BrownSand(棕沙): 以棕色為主的主題,可能給應用程式帶來溫暖和自然的感覺。
  • BlueNcs(藍NCS): 一種以藍色為主的主題,NCS 可能指的是一種顏色標準。
  • HighContrast(高對比度): 一個高對比度的主題,通常用於提供更好的可訪問性,特別適用於視力受損的用戶。
  • BlueIcy(藍冷): 一種以藍色為主,可能帶有冷色調的主題。
  • Qt(預設): 使用 Qt 預設主題,這個主題通常會遵循操作系統的外觀,保持一致性。

而同樣的設置圖表展示動畫則可以通過setAnimationOptions屬性來設置,通常動畫屬性有4種選項,這些設置通常用於控製圖表和軸的動畫效果。以下是簡要說明:

  1. NoAnimation(無動畫):
    • 不使用動畫效果。圖表和軸的狀態變化將會立即生效,沒有平滑的過渡效果。
  2. GridAxisAnimations(軸網格動畫):
    • 使用動畫效果來顯示或隱藏軸的網格線。在顯示或隱藏軸網格時,會有一個平滑的過渡效果。
  3. SeriesAnimations(數據系列動畫):
    • 使用動畫效果來顯示或隱藏數據系列。當數據系列被添加或移除時,或者改變可見性時,會有平滑的過渡效果。
  4. AllAnimations(所有動畫):
    • 同時啟用軸網格動畫和數據系列動畫。這樣會在顯示或隱藏軸網格和數據系列時都有平滑的過渡效果。

這些效果的設置通常需要使用下標的方式,而下標索引是從0開始的,案例中我們使用Qt預設主題,並將動畫AllAnimations完全啟用,當然讀者也可以將其定義為特定字元串方便使用,如下所示;

// ------------------------------------------
// 主題色定義
// ------------------------------------------
#define Theme_Light 0
#define Theme_BlueCerulean 1
#define Theme_Dark 2
#define Theme_BrownSand 3
#define Theme_BlueNcs 4
#define Theme_HighContrast 5
#define Theme_BlueIcy 6
#define Theme_Qt 7

// 設置圖表主題
ui->graphicsView->chart()->setTheme(QChart::ChartTheme(Theme_Qt));

// ------------------------------------------
// 動畫定義
// ------------------------------------------
#define NoAnimation 0
#define GridAxisAnimations 1
#define SeriesAnimations 2
#define AllAnimations 3

// 設置動畫效果
ui->graphicsView->chart()->setAnimationOptions(QChart::AnimationOptions(AllAnimations));

當設置動畫與主題色以後,再次打開程式此時就會展現出所有的過度動畫以及預設的主題,如下圖所示;

1.1.3 圖例設置

圖例設置,圖例指的是上圖中的頂部(一分鐘負載、五分鐘負載)的提示信息,通常是一個QLegend類的對象,通過QChart::legend()可以獲取到圖表的圖例,圖例是Qt組件根據數據集自動生成的,當然某些屬性我們也是可以調整的,例如圖例位置、顏色、字體等。

例如,設置圖例在圖標的上下左右四個方位,以下枚舉常量代表了對齊方式,可以用於設置控制項或繪圖元素在其父元素中的位置。

  1. Qt::AlignTop(頂部對齊):
    • 控制項或元素將與其父元素的頂部對齊。
  2. Qt::AlignBottom(底部對齊):
    • 控制項或元素將與其父元素的底部對齊。
  3. Qt::AlignLeft(左對齊):
    • 控制項或元素將與其父元素的左側對齊。
  4. Qt::AlignRight(右對齊):
    • 控制項或元素將與其父元素的右側對齊。

這些對齊方式常用於設置佈局、排列控制項或繪圖元素的位置。例如,當你使用佈局管理器(如 QVBoxLayoutQHBoxLayout)時,可以通過設置對齊方式來控制子控制項在父控制項中的相對位置,同理當使用setAlignment()函數時就可以用於設置QChart圖表中的圖例位置。

// ------------------------------------------
// 設置圖例屬性
// ------------------------------------------

// 圖例是否可見
ui->graphicsView->chart()->legend()->setVisible(true);

// 圖例背景框是否可見
ui->graphicsView->chart()->legend()->setBackgroundVisible(false);

// 將圖例設置到頂部
ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignTop);

// 將圖例設置到底部
ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignBottom);

// 將圖例設置到左側
ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignLeft);

// 將圖例設置到右側
ui->graphicsView->chart()->legend()->setAlignment(Qt::AlignRight);

如上代碼所示,由於我們最終覆蓋了上下左屬性,圖例將會停留在最右側,輸出效果圖如下;

圖例的字體與顏色也可以被自定義,字體的定義與頂部標題的定義相同,通過調用QFont來設置字體,通過QColor則用於設置顏色,字體類我們說過了,這裡就說一下QColor中有哪些方法可以使用吧。

以下是 QColor 類中常用的方法的說明和概述:

方法 描述
QColor() 預設構造函數,創建一個無效的顏色對象。
QColor(int r, int g, int b, int a = 255) 構造函數,使用RGB值和可選的透明度(Alpha通道)創建顏色對象。
QColor(Qt::GlobalColor color) 構造函數,使用Qt全局顏色枚舉值創建顏色對象。
QColor(const QString &name) 構造函數,使用顏色名創建顏色對象。例如,"red"或"#RRGGBB"。
int red() const 返回顏色的紅色分量。
int green() const 返回顏色的綠色分量。
int blue() const 返回顏色的藍色分量。
int alpha() const 返回顏色的透明度分量(Alpha通道)。
QRgb rgb() const 返回顏色的32位整數表示(0xRRGGBB)。
QColor darker(int factor = 200) const 返回一個較暗的顏色,可以通過指定因數調整暗度。
QColor lighter(int factor = 150) const 返回一個較亮的顏色,可以通過指定因數調整亮度。
bool isValid() const 檢查顏色是否為有效的顏色。
bool setNamedColor(const QString &name) 設置顏色為指定顏色名。如果顏色名有效,返回 true。
bool setRgb(int r, int g, int b, int a = 255) 設置顏色的RGB值和可選的透明度。如果值有效,返回 true。
bool setRgba(qreal r, qreal g, qreal b, qreal a = 1.0) 設置顏色的RGB浮點值和可選的透明度。如果值有效,返回 true。
QString name() const 返回顏色的名稱。如果顏色是基本顏色,則返回基本顏色的名稱。
QColor toRgb() const 返回顏色的RGB表示。
QColor toHsv() const 返回顏色的HSV表示。
QColor fromRgb(int r, int g, int b, int a = 255) 靜態方法,創建一個顏色對象,使用RGB值和可選的透明度。
QColor fromHsv(int h, int s, int v, int a = 255) 靜態方法,創建一個顏色對象,使用HSV值和可選的透明度。

這些方法允許你創建、操作和查詢顏色對象的各種屬性,包括RGB值、透明度、HSV值等。你可以使用這些方法來定製和操作顏色,以滿足應用程式的設計需求。

由於我們並不是所有的參數都需要修改,所以可以先通過legend()->font()先將預設的屬性讀入,然後再其基礎之上對特定的字體和顏色進行屬性調整,如下我們分別調整字體顏色;

// ------------------------------------------
// 設置圖例字體與顏色
// ------------------------------------------

// 獲取當前字體
QFont font = ui->graphicsView->chart()->legend()->font();

// 設置字體
font.setFamily("Arial");
font.setPointSize(25);
font.setBold(true);

// 設置到頁面
ui->graphicsView->chart()->legend()->setFont(font);

// 獲取當前顏色
QColor color = ui->graphicsView->chart()->legend()->labelColor();

// 設置標簽顏色
color.setRgb(170,0,255,255);

// 設置到頁面
ui->graphicsView->chart()->legend()->setLabelColor(color);

運行後,我們可以看到圖例中的數字變大了,並且居右側對齊了,顏色則是紫色,如下圖所示;

1.1.4 邊距設置

邊距的設置在多數時候是用不到的,因為Qt中預設的邊距已經就很合理了,但是在某些時候邊距也需要被調整,調整邊距可以通過調用setMargins函數來實現,該函數需要接收QMargins類,該類常用於表示矩形邊界。

以下是 QMargins 類中常用的方法的說明和概述:

方法 描述
QMargins() 預設構造函數,創建一個無邊距的對象。
QMargins(int left, int top, int right, int bottom) 構造函數,使用指定的邊距值創建對象。
int left() const 返回左邊距值。
void setLeft(int left) 設置左邊距值。
int top() const 返回上邊距值。
void setTop(int top) 設置上邊距值。
int right() const 返回右邊距值。
void setRight(int right) 設置右邊距值。
int bottom() const 返回下邊距值。
void setBottom(int bottom) 設置下邊距值。
bool isNull() const 檢查邊距是否為零,即是否所有邊距值都為零。
bool operator==(const QMargins &other) const 比較兩個邊距對象是否相等。
bool operator!=(const QMargins &other) const 比較兩個邊距對象是否不相等。
QMargins &operator+=(const QMargins &margins) 將另一個邊距對象的值添加到當前對象。
QMargins &operator-=(const QMargins &margins) 從當前對象的值中減去另一個邊距對象的值。
QMargins operator+(const QMargins &margins) const 返回當前對象與另一個邊距對象相加的結果。
QMargins operator-(const QMargins &margins) const 返回當前對象與另一個邊距對象相減的結果。

QMargins 類表示矩形的邊距,其包含了四個整數值,分別表示左、上、右、下的邊距。這些方法允許你設置和獲取邊距的各個部分,進行邊距的比較和運算等。這在界面佈局和繪圖等場景中經常用到,用於定義邊距和間距。

邊界的設置很簡單,來看如下代碼案例的演示,Qt中預設的邊界值應該均為10這個可以自己去驗證。

// ------------------------------------------
// 設置上下左右邊界
// ------------------------------------------

QMargins mgs;

// 設置邊界
mgs.setLeft(-10);
mgs.setRight(-10);
mgs.setTop(-10);
mgs.setBottom(-10);

// 刷新到圖表
ui->graphicsView->chart()->setMargins(mgs);

當運行後,讀者可觀察圖表中的變化,來體會邊界值是什麼,當然瞭如果讀者設置的負數太大繪圖很有可能脫離繪圖區;

2.1 序列與坐標軸

2.1.1 QLineSeries序列類

首先在繪圖之前,我們必須要先看一下QLineSeries折線圖類,以及QValueAxis坐標軸類,此處如果讀者需要繪製其他的圖形,比如折線圖中有另一種光滑折線圖,則就需要使用QSplineSeries類,根據不同的圖表需要使用不同的繪製類,此處我們就以普通折線圖為例,讓我們來看一下繪圖類中所支持的介面吧。

QLineSeries 是 Qt 中用於繪製折線圖的類,下麵是關於 QLineSeries 常用的方法的說明和概述:

方法 描述
void append(const QPointF &point) 向折線系列中追加一個數據點。
void append(QPointF &&point) 向折線系列中追加一個數據點(移動語義版本)。
void append(double x, double y) 向折線系列中追加指定坐標的數據點。
void replace(int index, const QPointF &point) 替換指定索引處的數據點。
void replace(int index, double x, double y) 替換指定索引處的數據點,使用指定坐標。
void remove(int index) 從折線系列中移除指定索引處的數據點。
void removePoints(int index, int count) 從折線系列中移除指定索引開始的指定數量的數據點。
void clear() 清空折線系列中的所有數據點。
QPointF at(int index) const 返回指定索引處的數據點。
int count() const 返回折線系列中數據點的數量。
bool isEmpty() const 檢查折線系列是否為空(不包含數據點)。
void setPen(const QPen &pen) 設置繪製折線時使用的筆。
QPen pen() const 返回當前用於繪製折線的筆。
void setPointLabelsFormat(const QString &format) 設置數據點標簽的顯示格式。
QString pointLabelsFormat() const 返回當前數據點標簽的顯示格式。
void setPointLabelsVisible(bool visible) 設置是否顯示數據點標簽。
bool pointsVisible() const 返回是否顯示數據點標簽。
void setUseOpenGL(bool enable) 設置是否使用OpenGL進行渲染。
bool useOpenGL() const 返回是否使用OpenGL進行渲染。
void setColor(const QColor &color) 設置折線的顏色。
QColor color() const 返回當前折線的顏色。
void setOpacity(qreal opacity) 設置折線的透明度。
qreal opacity() const 返回當前折線的透明度。

上述方法提供了一些基本的操作,例如追加、替換、移除數據點,以及設置折線的樣式、顏色等屬性。你可以根據需要使用這些方法來自定義和控制折線圖的外觀和行為。

首先我們先來實現對繪製線條的自定義,在創建序列線條時,我們通常會自定義線條的顏色,顏色的自定義可以使用QPen類來指定,以下是 QPen 類中常用的方法的說明和概述:

方法 描述
QPen() 預設構造函數,創建一個預設的畫筆。
QPen(Qt::PenStyle style) 使用指定的畫筆風格創建畫筆。
QPen(const QColor &color) 使用指定的顏色創建畫筆。
QPen(const QBrush &brush, qreal width = 0, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin) 使用指定的畫刷、寬度、風格、端點樣式和連接樣式創建畫筆。
void setColor(const QColor &color) 設置畫筆的顏色。
QColor color() const 返回畫筆的顏色。
void setStyle(Qt::PenStyle style) 設置畫筆的風格。
Qt::PenStyle style() const 返回畫筆的風格。
void setWidth(qreal width) 設置畫筆的寬度。
qreal width() const 返回畫筆的寬度。
void setCapStyle(Qt::PenCapStyle style) 設置畫筆的端點樣式。
Qt::PenCapStyle capStyle() const 返回畫筆的端點樣式。
void setJoinStyle(Qt::PenJoinStyle style) 設置畫筆的連接樣式。
Qt::PenJoinStyle joinStyle() const 返回畫筆的連接樣式。
void setBrush(const QBrush &brush) 設置畫筆的畫刷。
QBrush brush() const 返回畫筆的畫刷。
void setDashPattern(const QVector<qreal> &pattern) 設置虛線的模式。
QVector<qreal> dashPattern() const 返回虛線的模式。
void setDashOffset(qreal offset) 設置虛線的偏移。
qreal dashOffset() const 返回虛線的偏移。
void setCosmetic(bool cosmetic) 設置畫筆是否為“化妝品”筆。當為 true 時,筆將忽略設備的變換,保持筆寬度為一個像素。
bool isCosmetic() const 返回畫筆是否為“化妝品”筆。
void setTransform(const QTransform &matrix, bool combine = false) 設置畫筆的變換矩陣。
QTransform transform() const 返回畫筆的變換矩陣。
void setMiterLimit(qreal limit) 設置斜接連接的限制。
qreal miterLimit() const 返回斜接連接的限制。
bool operator==(const QPen &other) const 比較兩個畫筆是否相等。
bool operator!=(const QPen &other) const 比較兩個畫筆是否不相等。

這些方法允許你設置和獲取畫筆的各種屬性,如顏色、風格、寬度、樣式等。QPen 類用於定義在繪圖中如何繪製線條和邊框。你可以使用這些方法來自定義畫筆,以滿足應用程式的設計需求。

當有了QPen類就可以對顏色進行自定義了,讀者需要註意,曲線畫筆中有一個setStyle屬性,該屬性是用於指定畫筆風格的枚舉值,常用於設置 QPen 的風格。以下是這些枚舉值的說明:

  1. Qt::SolidLine(實線):
    • 表示使用實線繪製。
  2. Qt::DashLine(短劃線):
    • 表示使用短劃線繪製,即通過交替的短線和空白段繪製。
  3. Qt::DotLine(點線):
    • 表示使用點線繪製,即通過交替的點和空白段繪製。
  4. Qt::DashDotLine(點劃線):
    • 表示使用點劃線繪製,即通過交替的點、短劃線和空白段繪製。

這些枚舉值通常用於設置畫筆的風格,當有了這些前置條件以後,相信讀者能更容易地理解曲線序列是如何被創建出來的了,如下代碼則是一個完整版的創建流程,讀者可自行參考學習;

// ------------------------------------------
// 創建曲線序列
// ------------------------------------------

QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();

// 為序列設置名字
series0->setName("一分鐘負載");
series1->setName("五分鐘負載");

// 為曲線指定類型和屬性
QPen pen;

// 設置線條類型:Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
pen.setStyle(Qt::DotLine);
pen.setWidth(2);             // 設置序列寬度
pen.setColor(Qt::green);     // 設置綠色
series0->setPen(pen);        // 折線序列的線條設置

// 設置線條類型:Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
pen.setStyle(Qt::SolidLine);
pen.setColor(Qt::blue);      // 設置藍色
pen.setWidth(2);             // 設置序列寬度
series1->setPen(pen);        // 折線序列的線條設置

// 為序列曲線設置顏色
QColor color;
color.setRgb(170,0,255,255);   // 紫色配色
series0->setColor(color);      // 設置序列0

// 將序列添加到圖表
chart->addSeries(series0);
chart->addSeries(series1);

// -----------------------------------------------
// 其他附加參數
// -----------------------------------------------

// 序列是否可見
series0->setVisible(true);
series1->setVisible(true);

// 序列的數據點是否可見
series0->setPointsVisible(true);
series1->setPointsVisible(false);

// 序列的數據點標簽是否可見
series0->setPointLabelsVisible(false);
series1->setPointLabelsVisible(true);

// 序列數據點標簽顯示格式
series0->setPointLabelsFormat("(@xPoint,@yPoint)");
series1->setPointLabelsFormat("@yPoint");

// 序列透明度設置
series0->setOpacity(100/10.0);
series1->setOpacity(100/10.0);

// 設置序列數據點標簽顏色
QColor scolor=series0->pointLabelsColor();

scolor.setRgb(170,0,255,255);
series0->setPointLabelsColor(scolor);
series1->setPointLabelsColor(scolor);

// 設置序列數據點標簽字體
QFont font = series0->pointLabelsFont();
series0->setPointLabelsFont(font);

運行上述繪製代碼,讀者可以看到如下圖所示的案例,這裡之所以很亂是為了更好的演示函數功能,讀者可以自行關閉這些選項後依次觀察效果;

2.1.2 QValueAxis坐標軸類

接著我們就需要設置圖表中的坐標軸參數,本例中我們使用QValueAxis類的坐標軸,這是數值型坐標軸,其剛好可以與QLineSeries配合使用,當如Qt中提供了許多坐標軸,但他們都是從QAbstractAxis類繼承而來的。

QValueAxis 是用於處理數值軸的類,通常用於折線圖、散點圖等圖表類型。以下是關於 QValueAxis 常用的方法的說明和概述:

方法 描述
void setRange(qreal min, qreal max) 設置軸的數值範圍。
void setTickCount(int count) 設置軸上的刻度數量。
void setMinorTickCount(int count) 設置軸上每個刻度之間的小刻度數量。
void setLabelFormat(const QString &format) 設置刻度標簽的顯示格式。
void setLabelsVisible(bool visible) 設置是否顯示刻度標簽。
void setTitleText(const QString &title) 設置軸的標題。
void setTitleVisible(bool visible) 設置是否顯示軸的標題。
void setGridLineVisible(bool visible) 設置是否顯示網格線。
void setGridLineColor(const QColor &color) 設置網格線的顏色。
void setGridLinePen(const QPen &pen) 設置用於繪製網格線的筆。
void setLinePen(const QPen &pen) 設置軸線的筆。
qreal min() const 返回軸的最小值。
qreal max() const 返回軸的最大值。
int tickCount() const 返回軸上的刻度數量。
int minorTickCount() const 返回軸上每個刻度之間的小刻度數量。
QString labelFormat() const 返回刻度標簽的顯示格式。
bool isLabelsVisible() const 返回是否顯示刻度標簽。
QString titleText() const 返回軸的標題。
bool isTitleVisible() const 返回是否顯示軸的標題。
bool isGridLineVisible() const 返回是否顯示網格線。
QColor gridLineColor() const 返回網格線的顏色。
QPen gridLinePen() const 返回用於繪製網格線的筆。
QPen linePen() const 返回軸線的筆。

這些方法提供了對數值軸的各種設置和屬性獲取,包括範圍、刻度、標簽、標題、網格線等。你可以使用這些方法來定製數值軸以滿足你圖表的需求。

如下是坐標軸的常用配置參數,讀者可自行選擇不同的函數設置使用,其完整代碼如下所示;

// -----------------------------------------------
// 坐標軸配置
// -----------------------------------------------

// 創建坐標軸X
QValueAxis *axisX = new QValueAxis;

axisX->setRange(0, 10);             // 設置坐標軸範圍
axisX->setLabelFormat("%.1f");      // 標簽格式
axisX->setTickCount(11);            // 主分隔個數
axisX->setMinorTickCount(4);        // 設置軸上每個刻度之間的小刻度數量
axisX->setTitleText("X軸坐標");      // 標題

// 創建坐標軸Y
QValueAxis *axisY = new QValueAxis;
axisY->setRange(-2, 2);
axisY->setTitleText("Y軸坐標");
axisY->setTickCount(5);
axisY->setLabelFormat("%.2f");
axisY->setMinorTickCount(4);

// 設置坐標軸
chart->addAxis(axisX,Qt::AlignBottom);
chart->addAxis(axisY,Qt::AlignLeft);

 //序列 series0 附加坐標軸
series0->attachAxis(axisX);
series0->attachAxis(axisY);

//序列 series1 附加坐標軸
series1->attachAxis(axisX);
series1->attachAxis(axisY);

// -----------------------------------------------
// 其他附加參數
// -----------------------------------------------

// 刻度是否可見
axisX->setLineVisible(true);
axisY->setLineVisible(true);

// 坐標軸標題是否可見
axisX->setTitleVisible(true);
axisY->setTitleVisible(true);

// 軸的刻度標簽是否可見
axisX->setLabelsVisible(true);
axisY->setLabelsVisible(true);

// 軸的網格線是否可見
axisX->setGridLineVisible(true);
axisY->setGridLineVisible(true);

// 次級刻度是否可見
axisX->setMinorGridLineVisible(true);
axisY->setMinorGridLineVisible(true);

// 設置坐標軸的標題的字體
QFont fontX=axisX->titleFont();
axisX->setTitleFont(font);

// 設置坐標軸刻度標簽的文字顏色
QColor colorX=axisX->labelsColor();
axisX->setLabelsColor(colorX);

// 設置坐標軸刻度標簽的文字字體
axisX->setLabelsFont(font);

// 網格線的顏色設置
QColor colorLine=axisX->gridLineColor();
axisX->setGridLineColor(colorLine);

// 網格線的Pen設置
QPen penW;
penW=axisX->gridLinePen();
axisX->setGridLinePen(penW);

// 設置線條顏色
axisX->setLinePen(penW);
axisX->setLinePenColor(color);

// 次級刻度網格線顏色
QColor colorC=axisX->minorGridLineColor();
axisX->setMinorGridLineColor(colorC);

// 次級刻度線Pen設置
QPen penC;
penC=axisX->minorGridLinePen();
axisX->setMinorGridLinePen(pen);

最後是對數據進行初始化,因為初始化數據之前需要拿到series對象的指針,當得到該指針後,就可以通過調用append()方法或者是<<符號進行數據的追加操作,每次遞增intv迴圈直到cnt計數結束;

// ---------------------------------------------------
// 開始初始化數據
// ---------------------------------------------------

// 獲取指針
series0=(QLineSeries *)ui->graphicsView->chart()->series().at(0);
series1=(QLineSeries *)ui->graphicsView->chart()->series().at(1);

// 清空圖例
series0->clear();
series1->clear();

// 隨機數初始化
qsrand(QTime::currentTime().second());

qreal t=0,y1,y2,intv=0.1;
qreal rd;
int cnt=100;
for(int i=0;i<cnt;i++)
{
    rd=(qrand() % 10)-5;       // 隨機數,-5~+5
    y1=qSin(t)+rd/50;
    *series0<<QPointF(t,y1);   // 序列添加數據點
    // series0->append(t,y1);  // 序列添加數據點

    rd=(qrand() % 10)-5; //隨機數,-5~+5
    y2=qCos(t)+rd/50;
    // series1->append(t,y2);  // 序列添加數據點
    *series1<<QPointF(t,y2);   // 序列添加數據點

    t+=intv;
}

運行後讀者可以看到如下圖所示的輸出效果;

文章出處:https://www.cnblogs.com/LyShark/p/17923208.html
本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、異常信息描述 執行資料庫操作時,主鍵id沒有自增,且報“more than one owned sequence found”的異常,造成數據沒有insert進去,下麵是詳細的異常信息: java.lang.reflect.InvocationTargetException at sun.ref ...
  • 本文深入探討了安卓DocumentsProvider的應用場景,分析了其優勢與不足,並提供了簡單的代碼實現。DocumentsProvider是安卓系統中用於文件存儲與訪問的關鍵組件,為應用開發者提供了強大的文件管理能力。 ...
  • Android對接微信登錄記錄 - Stars-One的雜貨小窩 Android項目要對接下微信登錄,稍微記錄下踩坑點 代碼 1.添加依賴 implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0' 2.聲明Activity 在你 ...
  • login-status-iframe.html是keycloak為我們提供的一種檢測用戶登錄狀態的頁面,它要求用戶對接的系統通過iframe進行嵌入,然後通過window.addEventListener去訂閱子頁面的信息。 提示: 所有 HTML DOM 事件,可以查看我們完整的https:// ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近受夠了公司內部站點每次登陸都需要填寫用戶名和密碼,還有輸入驗證碼。 要是能夠直接跳過登陸頁面就好啦。 說乾就乾,決定使用油猴插件實現自動登陸功能。 其中最難解決的就是驗證碼破解,花了一天的時間完美解決,現在整理出來。 1.分析驗證碼 ...
  • 實現說明: 在 JS 中 canvas 原生沒有支持對文字間距的調整,我們可以通過將文字的每個字元單獨渲染來實現。本案例從 CanvasRenderingContext2D 對象的原型鏈上擴展了一個用於繪製帶間距的函數 fillTextWithSpacing(),使用方式與原生 fillText() ...
  • 1.關鍵字(keyword) 定義:被Java語言賦予了特殊含義,用做專門用途的字元串(或單詞),這些字元串(或單詞)已經被Java定義好了。 特點:全部關鍵字都是小寫字母。 關鍵字查閱的官方地址: https://docs.oracle.com/javase/tutorial/java/nutsa ...
  • 二三、編譯器 1、One Definition Rule 1)轉化單元 我們寫好的每個源文件(.cpp,.c)將其所包含的頭文件(#include <xxx.h>)合併後,稱為一個轉化單元。 編譯器單獨的將每一個轉化單元生成為對應的對象文件(.obj),對象文件包含了轉化單元的機器碼和轉化單元的引用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...