QT 圖表(拆線圖,欄狀圖,餅狀圖 ,動態圖表)

效果

折線圖

// 創建折線數據系列// 創建折線系列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); // 抗鋸齒
}

關鍵類說明?

  1. ?QPieSeries?

    • 用于管理餅圖的所有切片(QPieSlice)。
    • 通過?append(name, value)?添加數據。
  2. ?QPieSlice?

    • 控制單個切片的屬性,如顏色、標簽、突出顯示等。
    • 常用方法:setLabelVisible(),?setColor(),?setExploded()(突出顯示)。
  3. ?QChart?

    • 管理圖表布局、標題、圖例等。
    • 通過?addSeries()?添加數據系列。
  4. ?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?。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vector和list的區別是什么

vector 和 list 都是C 標準模板庫&#xff08;STL&#xff09;中的容器&#xff0c;它們的區別如下&#xff1a; 內存結構 - vector &#xff1a;是連續的內存空間&#xff0c;就像數組一樣&#xff0c;元素在內存中依次排列。 - list &#xff1a;是由節點組成的雙向鏈表…

【AI】【AIGC】降低AIGC檢測率:技術、挑戰與應對策略

引言 隨著生成式人工智能&#xff08;AIGC&#xff09;技術的迅速發展&#xff0c;越來越多的內容開始由人工智能生成。AIGC技術的應用非常廣泛&#xff0c;包括文本生成、圖像生成、音頻生成等。然而&#xff0c;隨著這些技術的普及&#xff0c;如何有效識別并檢測AIGC生成的…

vue3 ts 請求封裝后端接口

一 首頁-廣告區域-小程序 首頁-廣告區域-小程序 GET/home/banner1.1 請求封裝 首頁-廣告區域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函數定…

響應式CMS架構優化SEO與用戶體驗

內容概要 在數字化內容生態中&#xff0c;響應式CMS架構已成為平衡搜索引擎可見性與終端用戶體驗的核心載體。該系統通過多終端適配技術&#xff0c;確保PC、移動端及平板等設備的內容渲染一致性&#xff0c;直接降低頁面跳出率并延長用戶停留時長。與此同時&#xff0c;智能S…

算法基礎篇(1)(藍橋杯常考點)

算法基礎篇 前言 算法內容還有搜索&#xff0c;數據結構&#xff08;進階&#xff09;&#xff0c;動態規劃和圖論 數學那個的話大家也知道比較難&#xff0c;放在最后講 這期包含的內容可以看目錄 模擬那個算法的話就是題說什么寫什么&#xff0c;就不再分入目錄中了 注意事…

MyBatis一級緩存和二級緩存

介紹 在開發基于 MyBatis 的應用時&#xff0c;緩存是提升性能的關鍵因素之一。MyBatis 提供了一級緩存和二級緩存&#xff0c;合理使用它們可以顯著減少數據庫的訪問次數&#xff0c;提高系統的響應速度和吞吐量。本文將深入探討 MyBatis 一級緩存和二級緩存的工作原理、使用…

C++核心語法快速整理

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 本文主要為學過多門語言玩家快速入門C 沒有基礎的就放棄吧。 全部都是精華&#xff0c;看完能直接上手改別人的項目。 輸出內容 std::代表了這里的cout使用的標準庫&#xff0c;避免不同庫中的相同命名導致混亂 …

如何讓自動駕駛汽車“看清”世界?坐標映射與數據融合概述

在自動駕駛領域,多傳感器融合技術是實現車輛環境感知和決策控制的關鍵。其中,坐標系映射和對應是多傳感器融合的重要環節,它涉及到不同傳感器數據在統一坐標系下的轉換和匹配,以實現對車輛周圍環境的準確感知。本文將介紹多傳感器融合中坐標系映射和對應的數學基礎和實際應…

Unity Shader 的編程流程和結構

Unity Shader 的編程流程和結構 Unity Shader 的編程主要由以下三個核心部分組成&#xff1a;Properties&#xff08;屬性&#xff09;、SubShader&#xff08;子著色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它們的具體作用和結構&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是計算機科學中一項重要的操作&#xff0c;它將一組數據元素按照特定的順序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通過時間復雜度和空間復雜度來衡量。在 Python 中&#xff0c;有內置的排序函數&#xff0c;同時也可以手…

移除idea External Liraries 中maven依賴包

問題背景 擴展包里面不停的出現已經在POM文件注釋的包&#xff0c;其實是沒有查詢到根源位置。 在IDEA插件中搜索Maven Helper 點擊pom.xml文件 會出現擴展插件 定位之后在pom中添加exclusions&#xff0c;如下代碼 <dependency><groupId>com.disney.eva.framewo…

AI革命!藍耘攜手海螺AI視頻,打造智能化視頻新紀元

AI革命&#xff01;藍耘攜手海螺AI視頻&#xff0c;打造智能化視頻新紀元 前言 在這個信息爆炸的時代&#xff0c;視頻已經成為我們獲取信息、學習新知識的重要方式。而隨著人工智能&#xff08;AI&#xff09;技術的快速發展&#xff0c;AI與視頻內容的結合為我們帶來了全新的…

dify1.1.1安裝

1、 按照GitHub上操作 下載源碼&#xff0c;沒有安裝git的&#xff0c;可以下載成zip包&#xff0c; unzip 解壓 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、啟動前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可觀測性最佳實踐

ElasticSearch 概述 ElasticSearch 是一個開源的高擴展的分布式全文檢索引擎&#xff0c;它可以近乎實時的存儲、檢索數據&#xff1b;本身擴展性很好&#xff0c;可以擴展到上百臺服務器&#xff0c;處理 PB 級別&#xff08;大數據時代&#xff09;的數據。ES 也使用 Java 開…

Excel處理控件Spire.XLS系列教程:C# 在 Excel 中添加或刪除單元格邊框

單元格邊框是指在單元格或單元格區域周圍添加的線條。它們可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引讀者注意重要的單元格或使工作表看起來更美觀。本文將介紹如何使用 Spire.XLS for .NET 在 C# 中添加或刪除 Excel 單元格邊框。 安裝 Spire.XLS for .NET E-…

前端Wind CSS面試題及參考答案

目錄 標準盒模型與 IE 盒模型的區別是什么?如何通過 box-sizing 屬性切換這兩種盒模型? 如何計算一個元素在標準盒模型下的總寬度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?請列舉至少 3 種清除浮動的方法。 方法一:使用 clear 屬性 方法二:使用…

基于 ECharts 實現動態圖表渲染支持10萬+數據點實時更新方案

引言 實現支持10萬數據點實時更新的動態圖表渲染確實具有挑戰性&#xff0c;尤其是在性能和用戶體驗方面。以下是一些關鍵點和應用場景&#xff1a; 關鍵挑戰 性能優化&#xff1a; 渲染性能&#xff1a;大量數據點會導致瀏覽器渲染壓力大&#xff0c;可能引發卡頓。數據處理…

裝飾器模式 (Decorator Pattern)

裝飾器模式 (Decorator Pattern) 是一種結構型設計模式,它動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活。 一、基礎 1 意圖 動態地給一個對象添加一些額外的職責。 就增加功能來說,裝飾器模式相比生成子類更為靈活。 2 適用場景 當…

【Java】TCP網絡編程:從可靠傳輸到Socket實戰

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

藍橋杯C++基礎算法-0-1背包

這段代碼實現了一個經典的0-1 背包問題的動態規劃解法。0-1 背包問題是指給定一組物品&#xff0c;每個物品有其體積和價值&#xff0c;要求在不超過背包容量的情況下&#xff0c;選擇物品使得總價值最大。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&am…