【QT】Qt Charts概述

? ?

目錄

1 QtCharts模塊

2 圖表的主要組成部分

2.1 QChartView的功能

2.2 序列

2.3 坐標軸

2.4 圖例

3 一個簡單的QChart繪圖程序


?? ?QtCharts是Qt提供的圖表模塊,在Qt5.7以前只有商業版才有Qt Charts,但是從Qt5.7開始,社區版本也包含了Qt Charts。Qt Charts可以很方便地繪制常見的折線圖、柱狀圖、餅圖等圖表。

1 QtCharts模塊

?? ??? ?Qt Charts模塊是一組易于使用的圖表組件,它基于Qt的Graphics View架構,其核心組件是QChartView和QChart。

?? ??? ?QChartView的父類是QGraphicsView,就是Graphics View架構中的視圖組件,所以,QChart?View是用于顯示圖表的視圖。

?? ??? ?QChart的繼承關系如圖9-1所示,可以看到,QChart是從QGraphicsItem繼承而來的,所以,QChart是一種圖形項。

?? ??? ?QPolarChart是用于繪制極坐標圖的圖表類,它從QChart繼承而來。

要在項目中使用QtCharts模塊,必須在項目的配置文件(.pro文件)中增加下面的一行語句:

Qt+=charts

?? ??? ?在需要使用QtCharts的類的頭文件或源程序文件中,要使用如下的包含語句:

?? ??? ?#include?<QtCharts>

?? ??? ?using namespace QtCharts;

?? ??? ?也可以使用宏定義:

?? ??? ?#include?<QtCharts>

?? ??? ?Qt_CHARTS_USE_NAMESPACE

2 圖表的主要組成部分

?? ??? ?QChartView是QChart的視圖組件,而一個QChart一般包括序列、坐標軸、圖例、圖表標題等部分。

?? ??? ?QChart接口函數眾多,其主要接口函數分類整理后見下表。

分組

函數名

功能描述

圖表外觀

void setTitle()

void setTitIeFont()

void setTitleBrush()

void setTheme()

void setMargins()

QLegend * legend()

void setAnimationOptions()

設置圖表標題.顯示在圖表上方,支持HTML格式

設置圖表標題字體

設置圖表標題畫刷

設置主題,主題是內置的UI設置,定義了圖表的配色

設置繪圖區與圖表邊界的4個邊距

返回圖表的圖例

設置序列或坐標軸的動畫效果

數據序列

void addSeries()

QList< QAbstractSeries > series()

void removeSeries()

void removeAIISeries()

添加序列

返回圖表擁有的序列的列表

移除-個序列,但并不刪除序列對象

移除并刪除圖表的所有序列

坐標軸

void addAxis()

QList axes()?

void setAxisX()?

void setAxisY()?

void removeAxis()?

void createDefaultAxes()

為圖表的某個方向添加坐標軸?

返回某個方向的坐標軸列表?

設置某個序列的水平方向的坐標軸

設罝某個序列的垂直方向的坐標軸?

移除一個坐標軸?

根據己添加的序列的類型,創建缺省的坐標軸,前面已有的坐標軸會被刪除

?? ??? ?setAnimationOptions(AnimationOptions options)函數設置圖表的動畫效果,輸入參數是QChart::AnimationOptions枚舉類型,有以下幾種取值:

  • ????QChart::NoAnimation---- 無動畫效果

  • ????QChart::GridAxisAnimations---- 背景網格有動畫效果:

  • ????QChart::SeriesAnimations---- 序列有動畫效果:

  • ????QChart::AllAnimations—-—都有動畫效果

2.1 QChartView的功能

?? ??? ?QChartView是QChart的視圖組件,類似于GraphicsView架構中的QGraphicsView。實際上,在窗口設計界面上使用QChartView時,就是先放置一個QGraphicsView組件,然后升級為QChartView。

QChartView類定義的函數很少,只有以下幾個。

  • void setChart(QChart *chart),設置一個QChart對象作為顯示的圖表。

  • QChart* chart(),返回QChartView當前設置的QChart類對象。

  • void setRubberBand(RubberBands &rubberBand),設置選擇框的類型,即鼠標在視圖組件上拖動選擇范圍的方式,是一個QChartView::RubberBand枚舉類型的組合,QChartView::

RubberBand枚舉類型有以下幾種取值:

  • QChartView::NoRubberBand—無選擇框;

  • QChartView::VerticalRubberBand—垂向選擇:

  • QChartView::HorizontalRubberBand—水平選擇;

  • QChartView::RectangleRubberBand—矩形框選擇;

  • RubberBandsrubberBand(),返回設置的選擇框類型。

2.2 序列

?? ??? ?序列是數據的表現形式,如圖9-2中的兩條曲線就是兩個QLineseries類型的序列。

?? ??? ?圖表的類型主要就是由序列的類型決定的,常見的圖表類型有折線圖、柱狀圖、餅圖、散點圖等,QtCharts能實現的常見圖表示例及用到的序列類見表9-1。

?? ?? ??圖9-3是這些序列類的繼承關系,可見它們都是從QAbstractSenes類繼承而來的。折線、光滑線和散點的序列是從QXYSeries繼承而來,用于繪制二維平面的數據;QAbstractBarSeries派生出柱狀圖、百分比柱狀圖和堆疊圖等圖表的序列;面積圖、火柴盒圖、餅圖的序列都直接繼承于QAbstractSeries。

???? ?QLineSeries的主要函數見下表:

分組

函數

功能描述

序列名稱

void setName()

void setName()

圖表

QChart* chart()

返回序列所屬的圖表對象

序列外觀

void setVisibte()

void show()

void hide()

void setColor()

void setPen()

void setBrush()

void setOpacity()

設置序列可見性

顯示序列,使序列可見

隱藏序列,使序列不可見

設置序列線條的顏色

設置繪制線條的顏色

設置繪制數據點的畫刷

設置序列的透明度,0表示完全透明,1表示不透明

數據點

void setPointsVisible()

void append()

void insert()

void replace()

void clear()

void remove()

void removePoints()

int count()

QPointF& at()

QList<QPointF> points()

QVetor<QPointF> pointsVector()

設置數據點的可見性

添加一個數據點到序列

在某個位置插入一個數據點

替換某個數據點

清除所有數據點

刪除某個數據點

從某個位置開始,刪除指定個數的數據點

數據點的個數

返回某個位置上的數據點

返回數據點的列表

返回數據點的列表,效率更高

數據點標簽

void setPointLabeIsVisible()

void setPointLabelsColor()

void setPointLabelsFont()

void setPointLabelsFormat()

void setPointLabelsClipping()

設置數據點標簽的可見性

設置數據點標簽的文字顏色

設置數據點標簽字體

設置數據點標簽格式

設置標簽的裁剪屬性,缺省為True,即繪圖區外的標簽被裁剪掉

坐標軸

bool attachAxis()

bool detachAxis()

Qlist attachedAxes()

為序列附加-個坐標軸,通常需要一個X軸和一個Y軸

解除一個附加的坐標軸

返回附加的坐標軸的列表

2.3 坐標軸


? ? ? ? 一般的圖表都有橫軸和縱軸兩個坐標軸,如折線圖一般表示數據,坐標軸用QValueAxis類的數值坐標軸,如果用對數坐標,就可以使用QLogValueAxis類的坐標軸;柱狀圖的橫坐標通常是文字,可以用QBarCategoryAxis作為橫軸,而餅圖一般沒有坐標軸。
? ? ? ? Qt Charts的坐標軸類、特點及其適用情況見表9-2,類的繼承關系如圖9-4所示。

? ? ? ? QValueAxis類的 主要函數見下表:

分組

函數

功能描述

坐標軸整體

void setVisible()

Qt::Orientation orientation()

void setMin()

void setMax()

void setRange()

設置坐標軸可見性

返回坐標軸方向

設置坐標軸最小值

設置坐標軸最大值

設置坐標軸最小最大值表示的范圍

void setLabelFormat() ?

void setLabelsAngle()

void setLabelsBrush()

void setLabelsColor() ?

void setLabe!sFont()

void setLabelsVisible()

void setLabelFormat() ?

void setLabelsAngle()

void setLabelsBrush()

void setLabelsColor() ?

void setLabe!sFont()

void setLabelsVisible()

設置標簽格式,例如可以設置顯示的小數點位數

設置標簽的角度,單位為度

設置標簽的畫刷

設置標簽文字顏色

設置標簽文字字體

設置軸標簽文字是否可見

軸線和刻度線

void setTickCount()

void setLineVisible()

void setLinePen()

void setLinePenColor()

設置坐標軸主刻度的個數

設置軸線和刻度線的可見性、

設置軸線和刻度線的凼筆

設置軸線和刻度線的顏色

主網格線

void setGridUneColor() ?

void setGridLinePen() ?

void setGridLineVisible()

設置網格線的顏色

設置網格線的畫筆

設置網格線的可見性

次刻度線和次網格線

void setMinorTickCount()

void setMinorGridLineColor()

void setMinorGridLinePen()

void setMinorGridLineVisible()

設置兩個主刻度之間的次刻度的個數

設置次網格線的顏色

設置次網格線的畫筆

設置次網格線的可見性

坐標軸類封裝了坐標軸的刻度、標簽、網格線、標題等屬性,QValueAxis坐標軸有以下幾個組成部分:
? 坐標軸標題:是在坐標軸下方顯示的文字,表示坐標軸的名稱,圖中X軸坐標軸的標題是 "time(secs)"。坐標軸標題除了可以設置文字內容,還可以設置字體、畫刷和可見性。
? 軸線和刻度線:軸線是圖中從左到右的表示坐標軸的直線,刻度線是垂直于軸線的短線, 包括主刻度線和次刻度線,主刻度個數是tickCount(),每兩個主刻度之間的次刻度的個數是 minorTickCount()。
? 軸標簽:在主刻度處顯示的數值標簽文字,可以控制其數值格式、文字顏色和字體等。
? 主網格線:在繪圖區與主刻度對應的網格線,可以設置其顏色、線條的pen屬性、可見 性等。
? 次網格線:在繪圖區與次刻度對應的網格線,可以設置其顏色、線條的pen屬性、可見 性等。

2.4 圖例

圖例(Legend)是對圖表上顯示的序列的示例說明,如圖9-2中為兩條曲線顯示的圖例,有 線條顏色和文字說明。QLegend是封裝了圖例控制功能的類,可以為每個序列設置圖例中的文字, 可以控制圖例顯示在圖表的上、下、左、右不同位置。 對于圖例還有一個類QLegendMarker,可以為每個序列的圖例生成一個類似于QCheckBox的 組件,在圖例上單擊序列的標記,可以控制序列是否顯示。
例如,設置圖例顯示在圖表的底部可用下面的語句:
ui.chartView->chart()->legend()->setAlignment(Qt::AlignBottom);
設置圖例文字的字體的代碼如下:
void MainWindow::on_btnLegendFont_clicked(){????
????//圖例的字體設置????
????QFont font=ui->chartView->chart()->legend()->font();????
????bool ok=false;????
????font=QFontDialog::getFont(&ok,font);????
????if (ok)????????
????ui.chartView->chart()->legend()->setFont(font);
}

3 一個簡單的QChart繪圖程序

先用一個簡單實例程序說明QChart繪圖的基本原理。創建一個基于QMainWindow的應用程 序samp9_1,主窗口上不放置任何組件。在主窗口類中只定義一個createChart()函數,在主窗口的 構造函數中調用此函數,即:
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);createChart();
}

?createChart()函數用于創建圖表,其代碼如下:

void MainWindow::createChart()
{ //創建圖表QChartView *chartView=new QChartView(this); //創建 ChartViewQChart *chart = new QChart(); //創建 Chartchart->setTitle("簡單函數曲線");chartView->setChart(chart); //Chart添加到ChartViewthis->setCentralWidget(chartView);//創建曲線序列QLineSeries *series0 = new QLineSeries();QLineSeries *series1 = new QLineSeries();series0->setName("Sin曲線");series1->setName("Cos曲線");chart->addSeries(series0); //序列添加到圖表chart->addSeries(series1);//    QPen    pen;
//    pen.setStyle(Qt::DotLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
//    pen.setWidth(2);
//    pen.setColor(Qt::red);
//    series0->setPen(pen);//    pen.setStyle(Qt::SolidLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
//    pen.setColor(Qt::blue);
//    series1->setPen(pen);//序列添加數值qreal   t=0,y1,y2,intv=0.1;int cnt=100;for(int i=0;i<cnt;i++){y1=qSin(t);//+qrand();series0->append(t,y1);y2=qSin(t+20);series1->append(t,y2);t+=intv;}//    chart->createDefaultAxes();
//    chart->axisX()->setTitleText("time(secs)");
//    chart->axisY()->setTitleText("value");//創建坐標軸QValueAxis *axisX = new QValueAxis; //X 軸
//    curAxis=axisX;axisX->setRange(0, 10); //設置坐標軸范圍
//    axisX->setLabelFormat("%.1f"); //標簽格式
//    axisX->setTickCount(11); //主分隔個數
//    axisX->setMinorTickCount(4);axisX->setTitleText("time(secs)"); //標題
//    axisX->setGridLineVisible(false);QValueAxis *axisY = new QValueAxis; //Y 軸axisY->setRange(-2, 2);axisY->setTitleText("value");
//    axisY->setTickCount(5);
//    axisY->setMinorTickCount(4);
//    axisY->setLabelFormat("%.2f"); //標簽格式
//    axisY->setGridLineVisible(false);chart->setAxisX(axisX, series0); //為序列設置坐標軸chart->setAxisY(axisY, series0); //chart->setAxisX(axisX, series1); //為序列設置坐標軸chart->setAxisY(axisY, series1); //
}

? ?程序運行后界面如圖9-2所示。

?? ??? ?在createChart()函數里,首先創建一個QChartView對象chartView,再創建一個QChart對象chart,將chart在chartView里顯示,使用下面一行語句:

chartView->setChart(chart);

?? ??? ?圖表上用于顯示數據的稱為序列(series),這里使用折線序列QLineSeries,創建了兩個QLineSeries類型的序列,并且將序列添加到chart中。

chart->addSeries(series0);

chart->addSeries(series1);

?? ??? ?序列存儲用于顯示的數據,所以需要為直線序列添加平面數據點的坐標數據。程序將生成正弦和余弦函數的數據作為序列的數據。

?? ??? ?序列還需要坐標軸,創建QValueAxis類型的坐標軸作為圖表的X軸和Y軸,調用QChart的setAxisX()和setAxisY()函數為兩個序列分別設置X軸和Y軸。

圖9-2實例samp9_1運行時界面

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

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

相關文章

藍橋杯倒計時41天!DFS進階1——回溯

DFS進階1——回溯 先說一下回溯的板子 dfs(){ for(......){標記信息dfs()撤銷標記 } }回溯模板——遞歸實現排列型枚舉 題目分析 其實就是對1~n的數字全排列&#xff0c;這里就可以用dfs去做&#xff0c;1~n全排列我其實是確定每一個位置我應該放哪一個數字&#xff0c;那么…

Qt程序設計-解析和生成json詳解

目錄 概述 JSON的兩種結構 解析和生成json 解析對象結構 生成對象結構

【MySQL】mvcc以及三個重要日志

&#x1f34e;個人博客&#xff1a;個人主頁 &#x1f3c6;個人專欄&#xff1a;【】數據庫 ?? 功不唐捐&#xff0c;玉汝于成 目錄 前言 正文 MVCC關鍵概念&#xff1a; MVCC機制的優點&#xff1a; 三個重要的日志&#xff1a; 重做日志&#xff1a; 回滾日志&am…

【Java項目介紹和界面搭建】拼圖小游戲——打亂圖片順序

&#x1f36c; 博主介紹&#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】 &#x1f389;點贊?評論?收藏 …

再次走到了個人發展的十字路口

人生有非常多的十字路口 諸如&#xff1a;大學選擇專業、畢業選擇公司、選擇技術方向、兩年發展方向、三年發展方向、五年發展方向。 在之前&#xff0c;我選擇深入做elasticsearch&#xff0c;做專精es搜索和優化。做了大概4年時間。 但是現在又走到了很難抉擇的十字路口 第…

網絡仿真(一)

網絡仿真的意義 在網絡規劃和設計、網絡設備研發、網絡協議開發中&#xff0c;需要一種手段來反映和預測網絡的性能 網絡仿真可以提高網絡規劃設計的可靠性和準確性&#xff0c;明顯降低網絡投資風險&#xff0c;減少不必要的浪費 Ns-2 is a discrete event simulator Sched…

持安科技亮相張江高科895創業營,總評分第三名榮獲「最具創新性企業」!

近日&#xff0c;張江高科895創業營&#xff08;第十三季&#xff09;信息安全專場Demo day&結營儀式在上海集成電路設計產業園圓滿落幕。本季創業營通過多種渠道在海內外甄選優秀創業項目&#xff0c;一共擇優錄取了29家入營&#xff0c;最終甄選出9家代表參加Demo day路演…

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the ‘ssl‘報錯解決

安裝labelme出錯了 根據爆棧的提示信息&#xff0c;我在cmd運行以下命令之后一切正常了&#xff0c;解決了問題&#xff01; pip install urllib31.26.6參考網址&#xff1a;ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ‘ssl’ module is compile…

一文徹底搞懂基于數組和鏈表分別實現LRU算法

文章目錄 1. LRU算法2. 基于數組實現LRU算法3. 基于鏈表實現LRU算法 1. LRU算法 常見的緩存淘汰策略有三種&#xff0c;分別是&#xff1a;先進先出策略FIFO&#xff08;First In&#xff0c;First Out&#xff09;、最少使用策略LFU&#xff08;Least Frequently Used&#x…

董兆祥出席工業廢水資源化,開創變廢為寶新途徑演講

演講嘉賓&#xff1a;董兆祥 董事長 河北奧博水處理有限公司 演講題目&#xff1a;工業廢水資源化&#xff0c;開創變廢為寶新途徑 會議簡介 “十四五”規劃中提出&#xff0c;提高工業、能源領城智能化與信息化融合&#xff0c;明確“低碳經濟”新的戰略目標&#xff0c;熱…

springcloud:3.2測試超時機制

服務提供者 Openfeign遠程調用服務提供者搭建 文章地址http://t.csdnimg.cn/06iz8 PaymentController【控制層】 /*** 測試超時機制** return*/GetMapping("/timeout")public String TimeOut() {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {…

應用層DDoS防護:理解、必要性與實現策略

一、應用層簡介 應用層&#xff0c;也稱作第七層&#xff0c;是OSI&#xff08;開放系統互聯&#xff09;模型中的最高層。在這一層&#xff0c;數據以特定的應用程序協議格式進行傳輸&#xff0c;如HTTP、FTP、SMTP等。應用層的主要職責是為用戶提供網絡服務&#xff0c;如文…

【筆記】Android Telephony 獲取SubscriptionManager和TelephonyManager

背景 早期的手機只有單卡 &#xff0c;基本用默認卡&#xff08;代碼如下&#xff09;&#xff0c;那么雙卡手機的業務邏輯就會存在問題。 //手動搜網的功能案例&#xff0c;根據卡槽/Phone對象直接獲取信息private Context mcontext context; private Phone mPhone PhoneF…

LeetCode 560. 和為 K 的子數組

由于題目要求子數組必須連續&#xff0c;也就是需要一個和為K的區間&#xff0c;可以利用前綴和預處理后&#xff0c;枚舉找到這些區間段[l,r]&#xff0c;使之滿足s[r] - s[l] k。 不理解前綴和的可以先看這里。 class Solution { public:int subarraySum(vector<int>…

MongoDB聚合運算符:$count

文章目錄 語法使用舉例在$group階段中使用在$setWindowFields階段使用 $count聚合運算符返回分組中文檔的數量。從5.0開始支持。 語法 { $count: { } }$count不需要參數 使用 $count可以用于下列聚合階段&#xff1a; $bucket$bucket$group$setWindowFields 在$group階段中…

【vuex之五大核心概念】

vuex:五大核心概念 一、state狀態1.state的含義2.如何訪問以及使用倉庫的數據&#xff08;1&#xff09;通過store直接訪問獲取store對象 &#xff08;2&#xff09;通過輔助函數MapState 二、mutations1.作用2.嚴格模式3.操作流程定義 mutations 對象&#xff0c;對象中存放修…

Freesia 項目引用的依賴

UML圖 項目總依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version> </parent> <groupId>com.freesia</groupId> <artifa…

計算機網絡_2.1 物理層概述

2.1 物理層概述 一、物理層要實現的功能二、物理層接口特性 B站 深入淺出計算機網絡 2.1物理層概述 一、物理層要實現的功能 物理層要實現的功能就是在各種傳輸媒體上傳輸比特0和1&#xff0c;進而給上面的數據鏈路層提供透明傳輸比特流的服務。 數據鏈路層“看不見”&#xff…

劍指offer面試題22:鏈表中倒數第k個節點

面試題22&#xff1a;鏈表中倒數第k個節點 題目&#xff1a; 實現一種算法&#xff0c;找出單向鏈表中倒數第 k 個節點。返回該節點的值。 示例&#xff1a; 輸入&#xff1a; 1->2->3->4->5 和 k 2 輸出&#xff1a; 4思路&#xff1a; 1、求倒數第k個節點的…

設計模式-命令模式(Command Pattern)

承接Qt/C軟件開發項目&#xff0c;高質量交付&#xff0c;靈活溝通&#xff0c;長期維護支持。需求所尋&#xff0c;技術正適&#xff0c;共創完美&#xff0c;歡迎私信聯系&#xff01; 一、命令模式的說明 命令模式&#xff08;Command Pattern&#xff09;是一種行為設計模式…