QCustomPlot入門

        QCustomPlot 是一個基于 Qt 的 C++ 繪圖庫,專注于高效、美觀的 2D 數據可視化。進入QCustomPlot下載頁,下載最新的完整包(包含:源碼、文檔、示例)。

一、核心架構設計

1. 分層架構模型

層級主要組件職責說明
用戶接口層QCustomPlot 類提供頂層API,管理所有子組件
邏輯控制層坐標軸系統、圖例管理器、布局系統處理業務邏輯和交互控制
數據管理層QCPDataContainer 及其派生類高效存儲和檢索繪圖數據
渲染繪制層QCPPainter、OpenGL后端執行實際繪圖操作
交互處理層鼠標/鍵盤事件處理器、選擇系統處理用戶交互行為

2. 模塊依賴關系 

3.完整渲染流程

二、核心類介紹

1.核心類關系圖 

2.核心類方法詳解

 1). QCustomPlot(主控件)

關系

  • 包含多個 QCPLayer(圖層)

  • 管理 QCPLayoutElement(布局元素)

  • 持有 QCPAbstractPlottable(可繪圖對象)

關鍵方法

// 圖形管理
QCPGraph* addGraph(QCPAxis* keyAxis, QCPAxis* valueAxis);
void removePlottable(QCPAbstractPlottable* plottable);// 坐標軸訪問
QCPAxis* xAxis, *yAxis;  // 主坐標軸
QCPAxis* axis(QCPAxis::AxisType type);// 重繪控制
void replot(QCustomPlot::RefreshPriority priority = rpRefreshHint);
2). QCPAbstractPlottable(繪圖基類)

子類:折線圖(QCPGraph)、曲線圖(QCPCurve)、柱狀圖(QCPBars)、QCPStatiBox(盒子圖)、QCPColorMap(色譜圖)、QCPFinancial(金融圖)。

核心方法

// 數據綁定
virtual void setData(QSharedPointer<QCPDataContainer> data);// 視覺樣式
void setPen(const QPen& pen);
void setBrush(const QBrush& brush);// 坐標軸關聯
void setKeyAxis(QCPAxis* axis);
void setValueAxis(QCPAxis* axis);
3). QCPGraph(折線圖)

擴展方法

// 線型設置
void setLineStyle(QCPGraph::LineStyle ls);  // lsLine, lsStepLeft, lsNone等// 散點樣式
void setScatterStyle(const QCPScatterStyle& style);// 數據填充
void addData(const QVector<double>& keys, const QVector<double>& values);
void data()->removeBefore(double key);  // 刪除指定范圍前的數據

不同于Graph,其他的Plottable需要用new進行構造,而不是用addCurve、addBars等函數創建。已經存在的Plottable可以通過 QCustomPlot ::plottable(int index)訪問,plottable的數量可以用  QCustomPlot::plottableCount訪問。

    ui->widget1->xAxis->setLabel("x");ui->widget1->yAxis->setLabel("y");ui->widget1->xAxis->setRange(0,10);ui->widget1->yAxis->setRange(0,10);QCPBars *myBars = new QCPBars(ui->widget1->xAxis, ui->widget1->yAxis);// now we can modify properties of myBars:myBars->setName("Bars Series 1");QVector<double> keyData;QVector<double> valueData;keyData << 1 << 2 << 3;valueData << 2 << 4 << 8;myBars->setData(keyData, valueData);ui->widget1->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);ui->widget1->replot();
 4). QCPAxis(坐標軸)

關聯類

  • QCPGrid(網格)

  • QCPAxisTicker(刻度生成器)

關鍵方法

// 范圍控制
void setRange(double lower, double upper);
void setRange(const QCPRange& range);// 刻度配置
void setTicker(QSharedPointer<QCPAxisTicker> ticker);  // 時間/對數/文本刻度
void setTickLabels(bool show);// 標簽設置
void setLabel(const QString& text);
void setLabelFont(const QFont& font);
5). QCPLayoutElement(布局元素)

子類

  • QCPAxisRect(坐標軸矩形)

  • QCPLayoutGrid(網格布局)

  • QCPLegend(圖例)

核心方法

// 尺寸控制
void setMinimumSize(const QSize& size);
void setMaximumSize(const QSize& size);// 邊距設置
void setMargins(const QMargins& margins);
6. QCPAbstractItem(自定義圖元)

子類示例

  • QCPItemText(文本標簽)

  • QCPItemLine(參考線)

  • QCPItemRect(矩形框)

通用方法

// 位置錨點
QCPItemPosition* position(const QString& name);  // 例如 "start", "end"// 樣式設置
void setPen(const QPen& pen);
void setBrush(const QBrush& brush);
7.QCPLayer圖層

管理圖層元素(QCPLayerable),所有可顯示的對象都是繼承自圖層元素。 

QCustomPlot 內置了一套默認圖層系統,用于組織不同類型的繪圖元素。理解這些默認圖層對于有效控制繪圖順序和元素管理非常重要。

默認圖層層次結構(從底到頂)

  1. background - 最底層,適合放置背景元素

  2. grid - 網格線層

  3. main - 主圖層,大多數plottables的默認層

  4. axes - 坐標軸層

  5. legend - 圖例層

  6. overlay - 最頂層,適合放置覆蓋元素

各默認圖層的典型內容

圖層名稱包含元素默認模式
background背景矩形、背景圖片等lmLogical
grid網格線lmLogical
main圖形(QCPGraph)、柱狀圖(QCPBars)等lmLogical
axes坐標軸、軸標簽、刻度lmBuffered
legend圖例及其項lmBuffered
overlay頂層標注、浮動元素lmLogical

訪問和操作默認圖層

// 獲取特定默認圖層
QCPLayer *gridLayer = customPlot->layer("grid");
QCPLayer *mainLayer = customPlot->layer("main");// 檢查圖層是否存在
if (customPlot->hasLayer("legend")) {qDebug() << "存在legend圖層";
}// 獲取所有圖層列表
QList<QCPLayer*> allLayers = customPlot->layers();// 獲取圖層在堆疊順序中的索引
int layerIndex = customPlot->layerToIndex(mainLayer);

默認圖層的重要特性

  1. 自動創建:當創建QCustomPlot實例時,所有默認圖層會自動創建

  2. 繪制順序:圖層的繪制順序由QCustomPlot::mLayers列表決定,索引0最先繪制

  3. 默認分配

    QCPGraph *graph = customPlot->addGraph();  // 自動添加到"main"層
    QCPItemText *text = new QCPItemText(customPlot);  // 自動添加到"overlay"層
  4. 模式設置

    • lmLogical:直接繪制,無緩沖

    • lmBuffered:離屏緩沖后繪制(適合復雜靜態內容)

 

三、QCustomPlot 基礎入門

1. 安裝與配置

源碼集成
  1. 下載最新版 QCustomPlot 官網

  2. 將 qcustomplot.h 和 qcustomplot.cpp 添加到項目

  3. 在 .pro 文件中添加:

    QT += printsupport widgets
    SOURCES += qcustomplot.cpp
    HEADERS += qcustomplot.h

2. 基本繪圖流程

1)初始化

QCustomPlot *customPlot = new QCustomPlot(parent);
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

2)?數據圖形繪制
添加圖形對象并綁定數據:

customPlot->addGraph();  
QVector<double> xData = {1,2,3}, yData = {10,20,15};  
customPlot->graph(0)->setData(xData, yData);  // 數據綁定?

4)?坐標軸配置
設置坐標軸范圍和標簽:

customPlot->xAxis->setLabel("時間(秒)");  
customPlot->yAxis->setLabel("溫度(℃)");  
customPlot->xAxis->setRange(0, 5);  
customPlot->yAxis->setRange(0, 30);  // 動態范圍?

4)渲染與更新
調用 replot() 重繪圖形:

customPlot->replot();  // 強制刷新畫布?

完整示例代碼 

#include "qcustomplot.h"// 在窗口構造函數中
QCustomPlot *customPlot = new QCustomPlot(this);
setCentralWidget(customPlot);// 添加數據
QVector<double> x(101), y(101);
for (int i=0; i<101; ++i) {x[i] = i/50.0 - 1; // -1 到 1y[i] = x[i]*x[i];  // 拋物線
}// 創建圖形
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);// 設置坐標軸標簽
customPlot->xAxis->setLabel("x");
customPlot->yAxis->setLabel("y");// 自動縮放
customPlot->rescaleAxes();// 重繪
customPlot->replot();

四、核心功能詳解

1. 多種圖形類型

折線圖
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);
customPlot->graph(0)->setPen(QPen(Qt::blue));
散點圖
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);
customPlot->graph(0)->setScatterStyle(QCPScatterStyle::ssCircle);
customPlot->graph(0)->setLineStyle(QCPGraph::lsNone);
柱狀圖
QCPBars *bars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
bars->setData(x, y);
bars->setWidth(0.2); // 柱寬
熱力圖 
QCPColorMap *colorMap = new QCPColorMap(customPlot->xAxis, customPlot->yAxis);
colorMap->data()->setSize(200, 200)

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

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

相關文章

C語言快速入門-C語言基礎知識

這個c語言入門&#xff0c;目標人群是有代碼基礎的&#xff0c;例如你之前學過javaSE&#xff0c;看此文章可能是更有幫助&#xff0c;會讓你快速掌握他們之間的差異&#xff0c;文章內容大部分都是泛談&#xff0c;詳細的部分我會在之后時間發布&#xff0c;我也在慢慢學習&am…

【商城實戰(91)】安全審計與日志管理:為電商平臺筑牢安全防線

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…

信息安全工程師第 1 章

《信息安全工程師教程(第2版)》第一章 一、網絡信息安全基本概念與重要性 網絡信息安全定義 狹義:保障信息系統的機密性(C)、完整性(I)、可用性(A)——CIA三性。廣義:涵蓋國家安全、經濟安全、社會安全等的“大安全”。法律依據:《網絡安全法》定義網絡安全為防范攻…

為什么視頻文件需要壓縮?怎樣壓縮視頻體積即小又清晰?

在日常生活中&#xff0c;無論是為了節省存儲空間、便于分享還是提升上傳速度&#xff0c;我們常常會遇到需要壓縮視頻的情況。本文將介紹為什么視頻需要壓縮&#xff0c;壓縮視頻的好處與壞處&#xff0c;并教你如何使用簡鹿視頻格式轉換器輕松完成MP4視頻文件的壓縮。 為什么…

網絡空間安全(45)PHP入門學習

一、PHP文件與結構 PHP文件擴展名&#xff1a;PHP文件通常以.php作為擴展名&#xff0c;例如index.php。 PHP代碼嵌入&#xff1a;PHP代碼可以嵌入到HTML文件中&#xff0c;通常使用<?php ... ?>標簽包圍PHP代碼。短標簽<? ... ?>在某些配置下也可以使用&…

深入 OpenPDF:高級 PDF 生成與操作技巧

1 引言 1.1 項目背景 在許多企業級應用中,生成和操作 PDF 文檔是一個常見的需求。PDF(Portable Document Format)因其格式統一、易于打印和分發而被廣泛使用。本文將介紹如何使用 OpenPDF 庫在 Java 項目中生成和操作 PDF 文檔。 1.2 技術選型理由 OpenPDF:OpenPDF 是一…

力扣hot100——最長連續序列(哈希unordered_set)

題目鏈接&#xff1a;最長連續序列 1、錯解&#xff1a;數組做哈希表&#xff08;內存超出限制&#xff09; int longestConsecutive(vector<int>& nums) {vector<bool> hash(20000000010, false);for(int i0; i<nums.size();i){hash[1000000000nums[i]]t…

Qt中信號帶參傳值

在我們的Qt信號中是可以進行參數的傳遞的&#xff0c;不過格式上與寫普通函數不同。 這是頭文件中定義一個含參信號和一個含參槽函數 我們再來看它們兩個的綁定 。第一行的clicked()和on_btn_clicked()就是普通無參信號和槽的綁定&#xff1b;第二行就是上圖中兩個帶參信號和槽…

CSS3學習教程,從入門到精通, CSS3 列表控制詳解語法知識點及案例代碼(24)

CSS3 列表控制詳解 CSS 列表控制的語法知識點及案例代碼的詳細說明&#xff0c;包括 list-style-type、list-style-image、list-style-position 和 list-style 的用法。 1. list-style-type 屬性 list-style-type 屬性用于設置列表項標記的類型。 語法 list-style-type: v…

用Deepseek寫掃雷uniapp小游戲

掃雷作為Windows系統自帶的經典小游戲&#xff0c;承載了許多人的童年回憶。本文將詳細介紹如何使用Uniapp框架從零開始實現一個完整的掃雷游戲&#xff0c;包含核心算法、交互設計和狀態管理。無論你是Uniapp初學者還是有一定經驗的開發者&#xff0c;都能從本文中獲得啟發。 …

Dust3r、Mast3r、Fast3r

目錄 一.Dust3r 1.簡述 2.PointMap與ConfidenceMap 3.模型結構 4.損失函數 5.全局對齊 二.Mast3r 1.簡述 2.MASt3R matching 3.MASt3R sfm 匹配與標準點圖 BA優化 三.Fast3r 1.簡述 2.模型結構 3.損失函數 三維重建是計算機視覺中的一個高層任務&#xff0c;包…

學習不同電腦cpu分類及選購指南

學習不同電腦cpu分類及選購指南 關于電腦cpu 學習不同電腦cpu分類及選購指南一、CPU型號的核心組成與命名規則Intel命名規則:AMD命名規則:代數:具體型號:cpu后綴:Intel常見后綴及其含義:AMD后綴常見后綴及其含義:二、主流品牌CPU的分類與性能差異三、區分CPU型號的實用方…

【身份安全】零信任安全框架梳理(一)

目錄 零信任網絡安全防護理念一、定義零信任原則 二、零信任實現方式三、零信任的核心機制和思想1. 持續驗證&#xff08;Continuous Verification&#xff09;2. 多因素認證&#xff08;MFA&#xff09;與強身份驗證3. 細粒度權限控制&#xff08;最小權限原則&#xff09;4. …

【LeetCode Solutions】LeetCode 101 ~ 105 題解

CONTENTS LeetCode 101. 對稱二叉樹&#xff08;簡單&#xff09;LeetCode 102. 二叉樹的層序遍歷&#xff08;中等&#xff09;LeetCode 103. 二叉樹的鋸齒形層序遍歷&#xff08;中等&#xff09;LeetCode 104. 二叉樹的最大深度&#xff08;簡單&#xff09;LeetCode 105. 從…

革新汽車安全通信技術,美格智能全系車載通信模組支持NG-eCall

根據QYR&#xff08;恒州博智&#xff09;的統計及預測&#xff0c;2024年全球汽車無線緊急呼叫&#xff08;eCall&#xff09;設備市場銷售額達到了25.17億美元&#xff0c;預計2031年將達到44.97億美元&#xff0c;年復合增長率&#xff08;CAGR 2025-2031&#xff09;為8.8%…

Redis-04.Redis常用命令-字符串常用命令

一.字符串操作命令 set name jack 點擊左側name&#xff0c;顯示出值。 get name get abc&#xff1a;null setex key seconds value&#xff1a;設置過期時間&#xff0c;過期后該鍵值對將會被刪除。 然后再get&#xff0c;在過期時間內可以get到&#xff0c;過期get不到。…

一文總結常見項目排查

慢sql排查 怎么排查 通過如下命令&#xff0c;開啟慢 SQL 監控&#xff0c;執行成功之后&#xff0c;客戶端需要重新連接才能生效。 -- 開啟慢 SQL 監控 set global slow_query_log 1; 默認的慢 SQL 閥值是10秒&#xff0c;可以通過如下語句查詢慢 SQL 的閥值。 -- 查詢慢…

使用Python爬蟲獲取淘寶App商品詳情

在電商領域&#xff0c;獲取商品詳情數據對于市場分析、競品研究和用戶體驗優化至關重要。淘寶作為國內領先的電商平臺&#xff0c;提供了豐富的商品資源。雖然淘寶App的數據獲取相對復雜&#xff0c;但通過Python爬蟲技術&#xff0c;我們可以高效地獲取淘寶App商品的詳細信息…

Redis-06.Redis常用命令-列表操作命令

一.列表操作命令 LPUSH key value1 [value2]&#xff1a; LPUSH mylist a b c d: LRANGE key start stop&#xff1a; LRANGE mylist 0 -1&#xff1a; lrange mylist 0 2&#xff1a; d c b RPOP KEY&#xff1a;移除并返回最后一個元素 RPOP list a LLEN key…

客戶端給服務器發數據,服務器不顯示:開放端口操作

當你寫完UDP/TCP代碼進行測試時&#xff0c;發現沒出什么錯誤&#xff0c;但是不管你客戶端怎么發送消息&#xff0c;服務器就是不顯示&#xff0c;那么很有可能你云服務器沒開放端口。比如&#xff1a; 接下來教你開放端口&#xff1a; 一&#xff1a;進入你買云服務器的頁面…