C/C++ Qt QChart繪圖組件的具體使用
QtCharts 組件是QT中提供圖表繪制的模塊,該模塊可以方便的繪制常規(guī)圖形,Qtcharts 組件基于GraphicsView
模式實(shí)現(xiàn),其核心是QChartView
和QChart
的二次封裝版。
在使用繪圖模塊時(shí)需要在pro文件中包含QT += charts
來(lái)引入繪圖類(lèi)庫(kù)。
然后還需在頭文件中定義QT_CHARTS_USE_NAMESPACE
宏,這樣才可以正常的使用繪圖功能。
一般情況下我們會(huì)在mainwindows.h
頭文件中增加如下代碼段。
#include <QMainWindow> #include <QtCharts> QT_CHARTS_USE_NAMESPACE // 解決MSVC編譯時(shí),界面漢字亂碼的問(wèn)題 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif
由于QT中不存在單獨(dú)的繪圖畫(huà)布,因此在繪圖前我們需要在窗體中放入一個(gè)graphicsView
組件。
并在該組件上右鍵將其提升為QChartView
輸入需要提升的組件名稱(chēng),即可將該組件提升為全局繪圖組件。
繪制折線(xiàn)圖
折線(xiàn)圖的使用非常廣泛,如下代碼我們首先使用InitChart()
將畫(huà)布初始化,接著調(diào)用SetData()
實(shí)現(xiàn)在畫(huà)布中填充數(shù)據(jù),完整代碼如下。
#include "mainwindow.h" #include "ui_mainwindow.h" // 初始化Chart圖表 void MainWindow::InitChart() { // 創(chuàng)建圖表的各個(gè)部件 QChart *chart = new QChart(); chart->setTitle("系統(tǒng)性能統(tǒng)計(jì)圖"); // 將Chart添加到ChartView ui->graphicsView->setChart(chart); // this->setCentralWidget( ui->graphicsView); ui->graphicsView->setRenderHint(QPainter::Antialiasing); // 設(shè)置圖表主題色 ui->graphicsView->chart()->setTheme(QChart::ChartTheme(0)); // 創(chuàng)建曲線(xiàn)序列 QLineSeries *series0 = new QLineSeries(); QLineSeries *series1 = new QLineSeries(); series0->setName("一分鐘負(fù)載"); series1->setName("五分鐘負(fù)載"); // 序列添加到圖表 chart->addSeries(series0); chart->addSeries(series1); // 其他附加參數(shù) series0->setPointsVisible(false); // 設(shè)置數(shù)據(jù)點(diǎn)可見(jiàn) series1->setPointLabelsVisible(false); // 設(shè)置數(shù)據(jù)點(diǎn)數(shù)值可見(jiàn) // 創(chuàng)建坐標(biāo)軸 QValueAxis *axisX = new QValueAxis; // X軸 axisX->setRange(1, 100); // 設(shè)置坐標(biāo)軸范圍 axisX->setTitleText("X軸標(biāo)題"); // 標(biāo)題 axisX->setLabelFormat("%d %"); // 設(shè)置x軸格式 axisX->setTickCount(3); // 設(shè)置刻度 axisX->setMinorTickCount(3); QValueAxis *axisY = new QValueAxis; // Y軸 axisY->setRange(0, 100); // Y軸范圍(-1 - 20) axisY->setTitleText("Y軸標(biāo)題"); // 標(biāo)題 // 設(shè)置X于Y軸數(shù)據(jù)集 chart->setAxisX(axisX, series0); // 為序列設(shè)置坐標(biāo)軸 chart->setAxisY(axisY, series0); chart->setAxisX(axisX, series1); // 為序列設(shè)置坐標(biāo)軸 chart->setAxisY(axisY, series1); // 圖例被點(diǎn)擊后觸發(fā) foreach (QLegendMarker* marker, chart->legend()->markers()) { QObject::disconnect(marker, SIGNAL(clicked()), this, SLOT(on_LegendMarkerClicked())); QObject::connect(marker, SIGNAL(clicked()), this, SLOT(on_LegendMarkerClicked())); } } // 為序列生成數(shù)據(jù) void MainWindow::SetData() { // 獲取指針 QLineSeries *series0=(QLineSeries *)ui->graphicsView->chart()->series().at(0); QLineSeries *series1=(QLineSeries *)ui->graphicsView->chart()->series().at(1); // 清空?qǐng)D例 series0->clear(); series1->clear(); // 賦予數(shù)據(jù) qreal t=0,intv=1; for(int i=1;i<100;i++) { series0->append(t,i); // 設(shè)置軸粒度以及數(shù)據(jù) series1->append(t,i+10); // 此處用隨機(jī)數(shù)替代 t+=intv; // X軸粒度 } } // 將添加的widget控件件提升為QChartView類(lèi) MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); InitChart(); SetData(); } MainWindow::~MainWindow() { delete ui; } // 圖例點(diǎn)擊后顯示與隱藏線(xiàn)條 void MainWindow::on_LegendMarkerClicked() { QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender()); switch (marker->type()) { case QLegendMarker::LegendMarkerTypeXY: { marker->series()->setVisible(!marker->series()->isVisible()); marker->setVisible(true); qreal alpha = 1.0; if (!marker->series()->isVisible()) alpha = 0.5; QColor color; QBrush brush = marker->labelBrush(); color = brush.color(); color.setAlphaF(alpha); brush.setColor(color); marker->setLabelBrush(brush); brush = marker->brush(); color = brush.color(); color.setAlphaF(alpha); brush.setColor(color); marker->setBrush(brush); QPen pen = marker->pen(); color = pen.color(); color.setAlphaF(alpha); pen.setColor(color); marker->setPen(pen); break; } default: break; } }
效果如下所示:
繪制餅狀圖
餅狀圖用于統(tǒng)計(jì)數(shù)據(jù)的集的占用百分比,其繪制方式與折線(xiàn)圖基本一致,代碼如下。
#include "mainwindow.h" #include "ui_mainwindow.h" // 餅狀圖A void MainWindow::printA() { // 構(gòu)造數(shù)據(jù) [已用CPU 60%] [剩余CPU 40%] QPieSlice *slice_1 = new QPieSlice(QStringLiteral("已使用"), 0.6, this); slice_1->setLabelVisible(true); QPieSlice *slice_2 = new QPieSlice(QStringLiteral("可用"), 0.4, this); slice_2->setLabelVisible(true); // 將兩個(gè)餅狀分區(qū)加入series QPieSeries *series = new QPieSeries(this); series->append(slice_1); series->append(slice_2); // 創(chuàng)建Chart畫(huà)布 QChart *chart = new QChart(); chart->addSeries(series); chart->setAnimationOptions(QChart::AllAnimations); // 設(shè)置顯示時(shí)的動(dòng)畫(huà)效果 chart->setTitle("系統(tǒng)CPU利用率"); // 將參數(shù)設(shè)置到畫(huà)布 ui->graphicsView->setChart(chart); ui->graphicsView->setRenderHint(QPainter::Antialiasing); ui->graphicsView->chart()->setTheme(QChart::ChartTheme(0)); } // 餅狀圖B void MainWindow::printB() { // 構(gòu)造數(shù)據(jù) [C盤(pán) 20%] [D盤(pán) 30%] [E盤(pán) 50%] QPieSlice *slice_c = new QPieSlice(QStringLiteral("C盤(pán)"), 0.2, this); slice_c->setLabelVisible(true); QPieSlice *slice_d = new QPieSlice(QStringLiteral("D盤(pán)"), 0.3, this); slice_d->setLabelVisible(true); QPieSlice *slice_e = new QPieSlice(QStringLiteral("E盤(pán)"),0.5,this); slice_e->setLabelVisible(true); // 將兩個(gè)餅狀分區(qū)加入series QPieSeries *series = new QPieSeries(this); series->append(slice_c); series->append(slice_d); series->append(slice_e); // 創(chuàng)建Chart畫(huà)布 QChart *chart = new QChart(); chart->addSeries(series); chart->setAnimationOptions(QChart::AllAnimations); // 設(shè)置顯示時(shí)的動(dòng)畫(huà)效果 chart->setTitle("系統(tǒng)磁盤(pán)信息"); // 將參數(shù)設(shè)置到畫(huà)布 ui->graphicsView_2->setChart(chart); ui->graphicsView_2->setRenderHint(QPainter::Antialiasing); ui->graphicsView_2->chart()->setTheme(QChart::ChartTheme(3)); // 設(shè)置不同的主題 } // 將添加的widget控件件提升為QChartView類(lèi) MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); printA(); printB(); } MainWindow::~MainWindow() { delete ui; }
效果如下所示:
繪制柱狀圖
柱狀圖可用于一次展示多個(gè)用戶(hù)數(shù)據(jù),大體是使用上與折線(xiàn)圖大體一致,其代碼如下:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) { ui->setupUi(this); // 創(chuàng)建人名 QBarSet *set0 = new QBarSet("張三"); QBarSet *set1 = new QBarSet("李四"); QBarSet *set2 = new QBarSet("王五"); QBarSet *set3 = new QBarSet("蘇三"); QBarSet *set4 = new QBarSet("劉麻子"); // 分別為不同人添加bu不同數(shù)據(jù)集 *set0 << 1 << 2 << 8 << 4 << 6 << 6; *set1 << 5 << 2 << 5 << 4 << 5 << 3; *set2 << 5 << 5 << 8 << 15 << 9 << 5; *set3 << 8 << 6 << 7 << 5 << 4 << 5; *set4 << 4 << 7 << 5 << 3 << 3 << 2; // 將數(shù)據(jù)集關(guān)聯(lián)到series中 QBarSeries *series = new QBarSeries(); series->append(set0); series->append(set1); series->append(set2); series->append(set3); series->append(set4); // 增加頂部提示 QChart *chart = new QChart(); chart->addSeries(series); chart->setTitle("當(dāng)前人數(shù)統(tǒng)計(jì)"); chart->setAnimationOptions(QChart::SeriesAnimations); // 創(chuàng)建X軸底部提示 QStringList categories; categories << "周一" << "周二" << "周三" << "周四" << "周五" << "周六"; QBarCategoryAxis *axis = new QBarCategoryAxis(); axis->append(categories); chart->createDefaultAxes(); chart->setAxisX(axis, series); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); // 將參數(shù)設(shè)置到畫(huà)布 ui->graphicsView->setChart(chart); ui->graphicsView->setRenderHint(QPainter::Antialiasing); ui->graphicsView->chart()->setTheme(QChart::ChartTheme(0)); } MainWindow::~MainWindow() { delete ui; }
效果如下所示:
到此這篇關(guān)于C/C++ Qt QChart繪圖組件的具體使用的文章就介紹到這了,更多相關(guān) Qt QChart組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++簡(jiǎn)單又輕松的講解類(lèi)和對(duì)象中友元函數(shù)
采用類(lèi)的機(jī)制后實(shí)現(xiàn)了數(shù)據(jù)的隱藏與封裝,類(lèi)的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類(lèi)與外界間的通信接口。但是,有時(shí)需要定義一些函數(shù),這些函數(shù)不是類(lèi)的一部分,但又需要頻繁地訪(fǎng)問(wèn)類(lèi)的數(shù)據(jù)成員,這時(shí)可以將這些函數(shù)定義為該類(lèi)的友元函數(shù)2022-06-06C語(yǔ)言靜態(tài)動(dòng)態(tài)兩版本通訊錄實(shí)戰(zhàn)源碼
這篇文章主要為大家?guī)?lái)了C語(yǔ)言實(shí)現(xiàn)靜態(tài)動(dòng)態(tài)兩版本的通訊錄實(shí)戰(zhàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02C語(yǔ)言超市管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言超市管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02MySQL的內(nèi)存表的基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了MySQL的內(nèi)存表的基礎(chǔ)學(xué)習(xí)教程,包括內(nèi)存表的創(chuàng)建以及使用限制等等,需要的朋友可以參考下2015-12-12C語(yǔ)言多線(xiàn)程服務(wù)器的實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C語(yǔ)言多線(xiàn)程服務(wù)器的實(shí)現(xiàn)實(shí)例,文章用實(shí)例講解的很清楚,有對(duì)這方面不太懂的同學(xué)可以參考下2021-02-02C++中的按位與&、按位與或|、按位異或^運(yùn)算符詳解
這篇文章主要介紹了C++中的按位與&、按位與或|、按位異或^運(yùn)算符,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01淺析C語(yǔ)言中strtol()函數(shù)與strtoul()函數(shù)的用法
這篇文章主要介紹了淺析C語(yǔ)言中strtol()函數(shù)與strtoul()函數(shù)的用法,注意其將字符串轉(zhuǎn)換成long型的區(qū)別,需要的朋友可以參考下2015-08-08C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法
這篇文章主要介紹了C++歸并法+快速排序?qū)崿F(xiàn)鏈表排序的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04