Qt繪制圖表的實(shí)現(xiàn)
1 簡(jiǎn)介
使用Qt的charts模塊來(lái)繪制圖表,案例來(lái)自Qt自帶的demo。
charts模塊簡(jiǎn)介:Qt Chars模塊提供了一系列容易使用的圖表組件。需要使用charts組件時(shí),需要導(dǎo)入Qt Charts模塊,通過(guò)如下方式:QT += charts
在安裝Qt Creator的時(shí)候,需要勾選上這個(gè)模塊,不然是不能使用的。
2 Qt Charts總覽
Qt Chars支持繪制:坐標(biāo)圖、柱狀圖、折線圖、餅圖、曲線圖、散點(diǎn)圖等。
3 測(cè)試及說(shuō)明
首先創(chuàng)建一個(gè)工程,繼承至MainWindow組件。
(1)繪制折線圖
折線圖通過(guò)線段展示一系列相關(guān)聯(lián)的點(diǎn)。
使用的類:QLineSeries
測(cè)試代碼:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); /* * LineChart Example */ //添加一個(gè)QLineSeries實(shí)例 QLineSeries *lineseries = new QLineSeries(); //添加數(shù)據(jù)(點(diǎn)),有兩種方式 lineseries->append(0, 6); //參數(shù)分別為橫縱坐標(biāo) lineseries->append(2, 4); lineseries->append(3, 8); lineseries->append(7, 4); *lineseries << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2); //添加一個(gè)QChart實(shí)例,為了展示數(shù)據(jù) QChart *chart = new QChart(); chart->legend()->hide(); //隱藏圖例 chart->addSeries(lineseries); chart->createDefaultAxes(); chart->setTitle("Simple line chart example"); //添加一個(gè)QChartView圖例 QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); //呈現(xiàn)方式 //顯示 this->setCentralWidget(chartView); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); }
運(yùn)行測(cè)試:
(2)繪制曲線圖
使用的類:QSplineSeries
測(cè)試代碼:
QSplineSeries *series = new QSplineSeries(); series->setName("spline"); series->append(0, 6); series->append(2, 4); series->append(3, 8); series->append(7, 4); series->append(10, 5); QChart *chart = new QChart(); chart->legend()->hide(); chart->addSeries(series); chart->setTitle("Simple spline chart example"); chart->createDefaultAxes(); chart->axisY()->setRange(0, 10); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->setCentralWidget(chartView); this->resize(400, 300); this->show();
運(yùn)行測(cè)試:
(3)繪制面積圖
使用的類:QAreaSeries
測(cè)試代碼:
QLineSeries *series0 = new QLineSeries(); QLineSeries *series1 = new QLineSeries(); *series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6) << QPointF(16, 7) << QPointF(18, 5); *series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3) << QPointF(16, 4) << QPointF(18, 3); QAreaSeries *series = new QAreaSeries(series0, series1); series->setName("Batman"); QPen pen(0x059605); pen.setWidth(3); series->setPen(pen); QChart *chart = new QChart(); chart->addSeries(series); chart->setTitle("Simple areachart example"); chart->createDefaultAxes(); chart->axisX()->setRange(0, 20); chart->axisY()->setRange(0, 10); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->setCentralWidget(chartView); this->resize(400, 300); this->show();
運(yùn)行測(cè)試:
(4)繪制散點(diǎn)圖
使用的類:QScatterSeries
測(cè)試代碼:
QScatterSeries *series0 = new QScatterSeries(); series0->setName("scatter1"); series0->setMarkerShape(QScatterSeries::MarkerShapeCircle); series0->setMarkerSize(5.0); QScatterSeries *series1 = new QScatterSeries(); series1->setName("scatter2"); series1->setMarkerShape(QScatterSeries::MarkerShapeRectangle); series1->setMarkerSize(10.0); QScatterSeries *series2 = new QScatterSeries(); series2->setName("scatter3"); series2->setMarkerShape(QScatterSeries::MarkerShapeRectangle); series2->setMarkerSize(15.0); series0->append(0, 6); series0->append(2, 4); series0->append(3, 8); series0->append(7, 4); series0->append(10, 5); *series1 << QPointF(1, 1) << QPointF(3, 3) << QPointF(7, 6) << QPointF(8, 3) << QPointF(10, 2); *series2 << QPointF(1, 5) << QPointF(4, 6) << QPointF(6, 3) << QPointF(9, 5); QChart *chart = new QChart(); chart->addSeries(series0); chart->addSeries(series1); chart->addSeries(series2); chart->setTitle("Simple scatterchart example"); chart->createDefaultAxes(); chart->setDropShadowEnabled(false); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->resize(400, 300); this->show();
運(yùn)行測(cè)試:
(5)繪制柱狀圖
使用的類:QBarSeries
測(cè)試代碼:
QBarSet *set0 = new QBarSet("Jane"); QBarSet *set1 = new QBarSet("John"); QBarSet *set2 = new QBarSet("Axel"); QBarSet *set3 = new QBarSet("Mary"); QBarSet *set4 = new QBarSet("Samantha"); *set0 << 1 << 2 << 3 << 4 << 5 << 6; *set1 << 5 << 0 << 0 << 4 << 0 << 7; *set2 << 3 << 5 << 8 << 13 << 8 << 5; *set3 << 5 << 6 << 7 << 3 << 4 << 5; *set4 << 9 << 7 << 5 << 3 << 1 << 2; 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("Simple barchart example"); chart->setAnimationOptions(QChart::SeriesAnimations); QStringList categories; categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; QBarCategoryAxis *axis = new QBarCategoryAxis(); axis->append(categories); chart->createDefaultAxes(); chart->setAxisX(axis, series); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->resize(400, 300); this->show();
運(yùn)行測(cè)試:
(6)繪制餅圖
使用的類:QPieSeries
測(cè)試代碼:
QPieSeries *series = new QPieSeries(); series->append("Jane", 1); series->append("Joe", 2); series->append("Andy", 3); series->append("Barbara", 4); series->append("Axel", 5); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QChart *chart = new QChart(); chart->addSeries(series); chart->setTitle("Simple piechart example"); chart->legend()->hide(); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->resize(400, 300); this->show();
運(yùn)行測(cè)試:
完整的測(cè)試代碼:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QtCharts> #include <QPainter> #include <QPainterPath> #include <QtMath> #include <QImage> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); #if 0 /* * LineChart Example */ //添加一個(gè)QLineSeries實(shí)例 QLineSeries *lineseries = new QLineSeries(); //添加數(shù)據(jù)(點(diǎn)),有兩種方式 lineseries->append(0, 6); //參數(shù)分別為橫縱坐標(biāo) lineseries->append(2, 4); lineseries->append(3, 8); lineseries->append(7, 4); *lineseries << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2); //添加一個(gè)QChart實(shí)例,為了展示數(shù)據(jù) QChart *chart = new QChart(); chart->legend()->hide(); //隱藏圖例 chart->addSeries(lineseries); chart->createDefaultAxes(); chart->setTitle("Simple line chart example"); //添加一個(gè)QChartView圖例 QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); //呈現(xiàn)方式 //顯示 this->setCentralWidget(chartView); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); #endif #if 0 /* * SplineChart Example */ QSplineSeries *series = new QSplineSeries(); series->setName("spline"); series->append(0, 6); series->append(2, 4); series->append(3, 8); series->append(7, 4); series->append(10, 5); QChart *chart = new QChart(); chart->legend()->hide(); chart->addSeries(series); chart->setTitle("Simple spline chart example"); chart->createDefaultAxes(); chart->axisY()->setRange(0, 10); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); #endif #if 0 /* * AreaChart Example */ QLineSeries *series0 = new QLineSeries(); QLineSeries *series1 = new QLineSeries(); *series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6) << QPointF(16, 7) << QPointF(18, 5); *series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3) << QPointF(16, 4) << QPointF(18, 3); QAreaSeries *series = new QAreaSeries(series0, series1); series->setName("Batman"); QPen pen(0x059605); pen.setWidth(3); series->setPen(pen); QChart *chart = new QChart(); chart->addSeries(series); chart->setTitle("Simple areachart example"); chart->createDefaultAxes(); chart->axisX()->setRange(0, 20); chart->axisY()->setRange(0, 10); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); #endif #if 0 /* * QScatterChart Example */ QScatterSeries *series0 = new QScatterSeries(); series0->setName("scatter1"); series0->setMarkerShape(QScatterSeries::MarkerShapeCircle); series0->setMarkerSize(5.0); QScatterSeries *series1 = new QScatterSeries(); series1->setName("scatter2"); series1->setMarkerShape(QScatterSeries::MarkerShapeRectangle); series1->setMarkerSize(10.0); QScatterSeries *series2 = new QScatterSeries(); series2->setName("scatter3"); series2->setMarkerShape(QScatterSeries::MarkerShapeRectangle); series2->setMarkerSize(15.0); series0->append(0, 6); series0->append(2, 4); series0->append(3, 8); series0->append(7, 4); series0->append(10, 5); *series1 << QPointF(1, 1) << QPointF(3, 3) << QPointF(7, 6) << QPointF(8, 3) << QPointF(10, 2); *series2 << QPointF(1, 5) << QPointF(4, 6) << QPointF(6, 3) << QPointF(9, 5); QChart *chart = new QChart(); chart->addSeries(series0); chart->addSeries(series1); chart->addSeries(series2); chart->setTitle("Simple scatterchart example"); chart->createDefaultAxes(); chart->setDropShadowEnabled(false); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); #endif #if 0 /* * BarChart Example */ QBarSet *set0 = new QBarSet("Jane"); QBarSet *set1 = new QBarSet("John"); QBarSet *set2 = new QBarSet("Axel"); QBarSet *set3 = new QBarSet("Mary"); QBarSet *set4 = new QBarSet("Samantha"); *set0 << 1 << 2 << 3 << 4 << 5 << 6; *set1 << 5 << 0 << 0 << 4 << 0 << 7; *set2 << 3 << 5 << 8 << 13 << 8 << 5; *set3 << 5 << 6 << 7 << 3 << 4 << 5; *set4 << 9 << 7 << 5 << 3 << 1 << 2; 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("Simple barchart example"); chart->setAnimationOptions(QChart::SeriesAnimations); QStringList categories; categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; QBarCategoryAxis *axis = new QBarCategoryAxis(); axis->append(categories); chart->createDefaultAxes(); chart->setAxisX(axis, series); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); #endif #if 0 /* * Piechart Example */ QPieSeries *series = new QPieSeries(); series->append("Jane", 1); series->append("Joe", 2); series->append("Andy", 3); series->append("Barbara", 4); series->append("Axel", 5); QPieSlice *slice = series->slices().at(1); slice->setExploded(); slice->setLabelVisible(); slice->setPen(QPen(Qt::darkGreen, 2)); slice->setBrush(Qt::green); QChart *chart = new QChart(); chart->addSeries(series); chart->setTitle("Simple piechart example"); chart->legend()->hide(); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); this->setCentralWidget(chartView); this->resize(400, 300); this->show(); #endif } MainWindow::~MainWindow() { delete ui; }
還有一些圖形及主題等設(shè)置,后續(xù)待補(bǔ)充。
4 其它
(1)如何在QWidget中繪制QCharts
上面的代碼中都是在QMainWindow中繪制的QCharts,但如果我們要在QWidget中繪制QCharts,那么如何實(shí)現(xiàn)呢?
方式一:
可選擇的解決方法:在ui中拖一個(gè)水平布局,把chartView放到水平布局。
測(cè)試代碼:
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); /* * BarChart Example */ QBarSet *set0 = new QBarSet("Jane"); QBarSet *set1 = new QBarSet("John"); QBarSet *set2 = new QBarSet("Axel"); QBarSet *set3 = new QBarSet("Mary"); QBarSet *set4 = new QBarSet("Samantha"); *set0 << 1 << 2 << 3 << 4 << 5 << 6; *set1 << 5 << 0 << 0 << 4 << 0 << 7; *set2 << 3 << 5 << 8 << 13 << 8 << 5; *set3 << 5 << 6 << 7 << 3 << 4 << 5; *set4 << 9 << 7 << 5 << 3 << 1 << 2; 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("Simple barchart example"); chart->setAnimationOptions(QChart::SeriesAnimations); QStringList categories; categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; QBarCategoryAxis *axis = new QBarCategoryAxis(); axis->append(categories); chart->createDefaultAxes(); chart->setAxisX(axis, series); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); ui->horizontalLayout->addWidget(chartView); }
運(yùn)行測(cè)試:
這種方式每次是在水平布局中添加一個(gè)QWidget,有時(shí)候不太好用。
方式二:
將QWidget提升為QChartView。
在代碼中直接使用下面的代碼就可以顯示了:
ui->widget_factory->setChart(chart); ui->widget_factory->show();
(2)如何在柱狀圖中頂端帶數(shù)字顯示
只需要添加下面兩句代碼:
series->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd); series->setLabelsVisible(true);
到此這篇關(guān)于Qt繪制圖表的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt繪制圖表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的掃雷游戲
掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開(kāi)算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來(lái)詳解每一步分析2021-10-10利用C++11原子量如何實(shí)現(xiàn)自旋鎖詳解
當(dāng)自旋鎖嘗試獲取鎖時(shí)以忙等待(busy waiting)的形式不斷地循環(huán)檢查鎖是否可用,下面這篇文章主要給大家介紹了關(guān)于利用C++11原子量如何實(shí)現(xiàn)自旋鎖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-06-06C++?auto關(guān)鍵字的小知識(shí)點(diǎn)分享
這篇文章主要是來(lái)和大家介紹一些C++中的小知識(shí)點(diǎn),本文將從auto關(guān)鍵字開(kāi)始講起,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05C++實(shí)現(xiàn)調(diào)用系統(tǒng)時(shí)間簡(jiǎn)單示例
這篇文章主要介紹了C++實(shí)現(xiàn)調(diào)用系統(tǒng)時(shí)間,需要的朋友可以參考下2014-07-07如何使用C語(yǔ)言實(shí)現(xiàn)細(xì)菌的繁殖與擴(kuò)散
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)細(xì)菌的繁殖與擴(kuò)散,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11VS中scanf函數(shù)報(bào)錯(cuò)問(wèn)題的幾種解決方法
本文主要介紹了VS中scanf函數(shù)報(bào)錯(cuò)問(wèn)題的幾種解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C++的try塊與異常處理及調(diào)試技術(shù)實(shí)例解析
這篇文章主要介紹了C++的try塊與異常處理及調(diào)試技術(shù)實(shí)例解析,有助于讀者加深對(duì)try塊調(diào)試技術(shù)的認(rèn)識(shí),需要的朋友可以參考下2014-07-07Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問(wèn)題判斷方法
這篇文章主要介紹了Cocos2d-x保存用戶游戲數(shù)據(jù)之XML文件是否存在問(wèn)題判斷方法,請(qǐng)注意代碼中包含大量注釋,需要的朋友可以參考下2014-09-09