效果
折線圖
// 創建折線數據系列// 創建折線系列QLineSeries *series = new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 創建圖表并添加系列QChart *chart = new QChart;chart->addSeries(series);chart->setTitle("實時數據監控");chart->setAnimationOptions(QChart::SeriesAnimations); // 啟用動畫// 顯式創建軸(Qt6 兼容)QValueAxis *axisX = new QValueAxis;QValueAxis *axisY = new QValueAxis;chart->addAxis(axisX, Qt::AlignBottom);chart->addAxis(axisY, Qt::AlignLeft);series->attachAxis(axisX);series->attachAxis(axisY);axisX->setTitleText("時間");axisY->setTitleText("數值");axisX->setRange(0, 10);//設置范圍axisY->setRange(0, 100);// 將圖表嵌入到 QChartView 中顯示// QChartView *chartView = new QChartView(chart);// chartView->setRenderHint(QPainter::Antialiasing); // 抗鋸齒// chartView->resize(800, 600);//this->setCentralWidget(chartView);//代碼中綁定到布局//ui->verticalLayout->addWidget(chartView); // 添加到布局ui->chartViewLine->setChart(chart);ui->chartViewLine->setRenderHint(QPainter::Antialiasing); // 抗鋸齒// 動態更新數據// 定時器動態追加數據QTimer *timer = new QTimer(this);QObject::connect(timer, &QTimer::timeout, [=]() {static int currentX = 0;// 當前數據點的 X 值//動態添加數據series->append(currentX, QRandomGenerator::global()->bounded(100));axisX->setMax(currentX); // 自動擴展 X 軸范圍// 控制數據量不超過30個// if (series->count() > 30) {// series->remove(0); // 移除最舊的點// }// // 動態調整 X 軸范圍,顯示最近30個點// if (currentX >= 30) {// axisX->setRange(currentX - 29, currentX);// } else {// axisX->setRange(0, currentX);// }if(currentX > max_x){series->removePoints(0,series->count() - max_x);axisX->setMin(currentX - max_x + 1);}currentX++;});timer->start(1000); // 每秒添加一個點
柱狀圖
//創建柱狀圖(Bar Chart)QBarSet *set0 = new QBarSet("數據A");QBarSet *set1 = new QBarSet("數據B");*set0 << 1 << 2 << 3 << 4 << 5;*set1 << 5 << 4 << 3 << 2 << 1;QBarSeries *seriesBar = new QBarSeries();seriesBar->append(set0);seriesBar->append(set1);QChart *chartBar = new QChart();chartBar->addSeries(seriesBar);chartBar->setTitle("柱狀圖示例");chartBar->setAnimationOptions(QChart::SeriesAnimations); // 啟用動畫// 設置分類軸QStringList categories {"Jan", "Feb", "Mar", "Apr", "May"};QBarCategoryAxis *axisXBar = new QBarCategoryAxis();axisXBar->append(categories);chartBar->addAxis(axisXBar, Qt::AlignBottom);seriesBar->attachAxis(axisXBar);// 顯示// QChartView *chartViewBar = new QChartView(chart);// chartViewBar->show();ui->chartViewBar->setChart(chartBar);ui->chartViewBar->show();
餅狀圖
// 創建餅圖系列QPieSeries *seriesPie = new QPieSeries();seriesPie->append("Apple", 30); // 添加數據切片seriesPie->append("Banana", 20);seriesPie->append("Orange", 50);// 自定義切片樣式(可選)for (QPieSlice *slice : seriesPie->slices()) {slice->setLabelVisible(true); // 顯示標簽slice->setLabelColor(Qt::black); // 標簽顏色slice->setLabelPosition(QPieSlice::LabelOutside); // 標簽位置}// 創建圖表并添加系列QChart *chartPie = new QChart();chartPie->addSeries(seriesPie);chartPie->setTitle("餅圖標題"); // 圖表標題chartPie->legend()->setVisible(true); // 顯示圖例chartPie->legend()->setAlignment(Qt::AlignRight); // 圖例位置// 顯示圖表ui->chartViewPie->setChart(chartPie);ui->chartViewPie->setRenderHint(QPainter::Antialiasing); // 抗鋸齒
UI
引用
QT += charts
完整代碼
頭文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
// 在頭文件或源文件的最頂部定義宏
//#define QT_CHARTS_USE_NAMESPACE
#include <QtCharts>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
#include <QValueAxis>
#include <QMainWindow>//QT_CHARTS_USE_NAMESPACEQT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;void initChart();int qrand();int max_x = 30;
};
#endif // MAINWINDOW_H
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCharts>
#include <QtCharts/QChartView>
#include <QtCharts/QSplineSeries>
#include <QValueAxis>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);initChart();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::initChart()
{// 創建折線數據系列// 創建折線系列QLineSeries *series = new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 創建圖表并添加系列QChart *chart = new QChart;chart->addSeries(series);chart->setTitle("實時數據監控");chart->setAnimationOptions(QChart::SeriesAnimations); // 啟用動畫// 顯式創建軸(Qt6 兼容)QValueAxis *axisX = new QValueAxis;QValueAxis *axisY = new QValueAxis;chart->addAxis(axisX, Qt::AlignBottom);chart->addAxis(axisY, Qt::AlignLeft);series->attachAxis(axisX);series->attachAxis(axisY);axisX->setTitleText("時間");axisY->setTitleText("數值");axisX->setRange(0, 10);//設置范圍axisY->setRange(0, 100);// 將圖表嵌入到 QChartView 中顯示// QChartView *chartView = new QChartView(chart);// chartView->setRenderHint(QPainter::Antialiasing); // 抗鋸齒// chartView->resize(800, 600);//this->setCentralWidget(chartView);//代碼中綁定到布局//ui->verticalLayout->addWidget(chartView); // 添加到布局ui->chartViewLine->setChart(chart);ui->chartViewLine->setRenderHint(QPainter::Antialiasing); // 抗鋸齒// 動態更新數據// 定時器動態追加數據QTimer *timer = new QTimer(this);QObject::connect(timer, &QTimer::timeout, [=]() {static int currentX = 0;// 當前數據點的 X 值//動態添加數據series->append(currentX, QRandomGenerator::global()->bounded(100));axisX->setMax(currentX); // 自動擴展 X 軸范圍// 控制數據量不超過30個// if (series->count() > 30) {// series->remove(0); // 移除最舊的點// }// // 動態調整 X 軸范圍,顯示最近30個點// if (currentX >= 30) {// axisX->setRange(currentX - 29, currentX);// } else {// axisX->setRange(0, currentX);// }if(currentX > max_x){series->removePoints(0,series->count() - max_x);axisX->setMin(currentX - max_x + 1);}currentX++;});timer->start(1000); // 每秒添加一個點//創建柱狀圖(Bar Chart)QBarSet *set0 = new QBarSet("數據A");QBarSet *set1 = new QBarSet("數據B");*set0 << 1 << 2 << 3 << 4 << 5;*set1 << 5 << 4 << 3 << 2 << 1;QBarSeries *seriesBar = new QBarSeries();seriesBar->append(set0);seriesBar->append(set1);QChart *chartBar = new QChart();chartBar->addSeries(seriesBar);chartBar->setTitle("柱狀圖示例");chartBar->setAnimationOptions(QChart::SeriesAnimations); // 啟用動畫// 設置分類軸QStringList categories {"Jan", "Feb", "Mar", "Apr", "May"};QBarCategoryAxis *axisXBar = new QBarCategoryAxis();axisXBar->append(categories);chartBar->addAxis(axisXBar, Qt::AlignBottom);seriesBar->attachAxis(axisXBar);// 顯示// QChartView *chartViewBar = new QChartView(chart);// chartViewBar->show();ui->chartViewBar->setChart(chartBar);ui->chartViewBar->show();// 創建餅圖系列QPieSeries *seriesPie = new QPieSeries();seriesPie->append("Apple", 30); // 添加數據切片seriesPie->append("Banana", 20);seriesPie->append("Orange", 50);// 自定義切片樣式(可選)for (QPieSlice *slice : seriesPie->slices()) {slice->setLabelVisible(true); // 顯示標簽slice->setLabelColor(Qt::black); // 標簽顏色slice->setLabelPosition(QPieSlice::LabelOutside); // 標簽位置}// 創建圖表并添加系列QChart *chartPie = new QChart();chartPie->addSeries(seriesPie);chartPie->setTitle("餅圖標題"); // 圖表標題chartPie->legend()->setVisible(true); // 顯示圖例chartPie->legend()->setAlignment(Qt::AlignRight); // 圖例位置// 顯示圖表ui->chartViewPie->setChart(chartPie);ui->chartViewPie->setRenderHint(QPainter::Antialiasing); // 抗鋸齒
}
關鍵類說明?
-
?QPieSeries?
- 用于管理餅圖的所有切片(
QPieSlice
)。 - 通過?
append(name, value)
?添加數據。
- 用于管理餅圖的所有切片(
-
?QPieSlice?
- 控制單個切片的屬性,如顏色、標簽、突出顯示等。
- 常用方法:
setLabelVisible()
,?setColor()
,?setExploded()
(突出顯示)。
-
?QChart?
- 管理圖表布局、標題、圖例等。
- 通過?
addSeries()
?添加數據系列。
-
?QChartView?
- 用于顯示圖件的 Widget,支持抗鋸齒渲染。
自定義樣式?
-
?修改顏色?:
-
slice->setColor(QColor("#FF5733")); // 設置切片顏色
?突出顯示切片?:
-
slice->setExploded(true); // 使切片突出 slice->setExplodeDistanceFactor(0.1); // 突出距離
在 Qt Charts 中,
AnimationOption
?是?QChart
?類中用于控制圖表動畫效果的枚舉類型,其具體定義如下: -
1. 枚舉值說明?
AnimationOption
?包含以下選項 ??6?: - ?
NoAnimation
?
禁用所有動畫效果。 - ?
GridAxisAnimations
?
啟用坐標軸網格的動畫(如縮放、平移時網格漸變效果)。 - ?
SeriesAnimations
?
啟用數據系列的動畫(如餅圖切片展開、折線圖數據點漸變)。 - ?
AllAnimations
?
啟用全部動畫效果(等同于?GridAxisAnimations | SeriesAnimations
)。 -
2. 組合使用?
AnimationOptions
?是?QFlags<AnimationOption>
?類型,支持通過位運算組合多個選項 ??6?。例如: -
chart->setAnimationOptions(QChart::GridAxisAnimations | QChart::SeriesAnimations);
?3. 應用方法?
通過?
QChart::setAnimationOptions()
?方法設置動畫效果 ??4,6?: -
QChart *chart = new QChart(); chart->setAnimationOptions(QChart::AllAnimations); // 啟用所有動畫
?5. 相關配置?
- ?動畫時長?:通過?
QChart::setAnimationDuration()
?調整動畫時長(默認 1000ms)??46?。 - ?緩動曲線?:通過?
QChart::setAnimationEasingCurve()
?設置動畫緩動效果(如彈性、加速曲線)??6?。 -
?適用場景?
- 數據動態更新時(如實時折線圖),建議啟用?
SeriesAnimations
?提升視覺效果 ??67?。 - 靜態圖表中可禁用動畫(
NoAnimation
)以減少性能開銷 ??6?。