0


Qt(十三)QChart绘制折线图

文章目录

一、简单绘图

Qt Charts基于Qt的Graphics View架构,其核心组件是QChartViewQChart

  • QChartView是显示图标的视图,基类为QGraphicsView
  • QChart的基类是QGraphicsltem

类的继承关系:
在这里插入图片描述
创建项目:

  1. .pro

文件中添加:

  1. QT += charts

代码如下:其他文件未修改,修改代码只在mainwindow.cpp文件中进行。
mainwindow.cpp

  1. #include"mainwindow.h"#include"ui_mainwindow.h"#include<QChartView>#include<QLineSeries>#include<QValueAxis>#include<QtMath>
  2. QT_CHARTS_USE_NAMESPACE
  3. MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow){
  4. ui->setupUi(this);setWindowTitle("QChart简单绘图");//创建图表框架
  5. QChartView* cview =newQChartView(this);
  6. QChart* chart =newQChart();
  7. chart->setTitle("简单函数曲线");
  8. cview->setChart(chart);setCentralWidget(cview);//创建折现序列
  9. QLineSeries* seriesS =new QLineSeries;
  10. QLineSeries* seriesC =new QLineSeries;
  11. seriesS->setName("Sinθ");
  12. seriesC->setName("Cosθ");
  13. chart->addSeries(seriesS);
  14. chart->addSeries(seriesC);//添加数据绘制
  15. qreal y0,y1,t=0,intv=0.1;
  16. size_t count=100;for(size_t i=0;i<count;i++){
  17. y0 =qSin(t);
  18. y1 =qCos(t);
  19. seriesS->append(t,y0);
  20. seriesC->append(t,y1);
  21. t += intv;}//创建坐标轴
  22. QValueAxis* axisX =new QValueAxis;
  23. axisX->setRange(0,10);
  24. chart->setAxisX(axisX,seriesS);
  25. chart->setAxisX(axisX,seriesC);
  26. QValueAxis* axisY =new QValueAxis;
  27. axisY->setRange(-1,1);
  28. chart->setAxisY(axisY,seriesS);
  29. chart->setAxisY(axisY,seriesC);}MainWindow::~MainWindow(){delete ui;}

在这里插入图片描述

二、绘制折线图

数据序列类继承关系
在这里插入图片描述
坐标类继承关系
在这里插入图片描述

实例

初步UI设计
1
2
3

自定义DialogPen类

新建

  1. DialogPen

类继承

  1. QDialog

  1. #ifndefDIALOGPEN_H#defineDIALOGPEN_H#include<QDialog>#include<QColorDialog>#include<QPen>#include<QPalette>namespace Ui {classDialogPen;}classDialogPen:publicQDialog{
  2. Q_OBJECT
  3. public:explicitDialogPen(QWidget *parent =nullptr);~DialogPen();
  4. QPen getpen();static QPen getPen(QPen initPen,bool&ok);voidsetPen(const QPen &pen);private slots:voidon_pushButton_clicked();private:
  5. QPen m_pen;
  6. Ui::DialogPen *ui;};#endif// DIALOGPEN_H
  1. #include"dialogpen.h"#include"ui_dialogpen.h"#include<QString>DialogPen::DialogPen(QWidget *parent):QDialog(parent),ui(new Ui::DialogPen){
  2. ui->setupUi(this);
  3. ui->comboBox->clear();
  4. ui->comboBox->addItem("NoPen",0);
  5. ui->comboBox->addItem("SolidLine",1);
  6. ui->comboBox->addItem("DashLine",2);
  7. ui->comboBox->addItem("DotLine",3);
  8. ui->comboBox->addItem("DashDotLine",4);
  9. ui->comboBox->addItem("DashDotDotLine",5);
  10. ui->comboBox->addItem("CustomDashLine",6);
  11. ui->comboBox->setCurrentIndex(0);}DialogPen::~DialogPen(){delete ui;}voidDialogPen::on_pushButton_clicked(){
  12. QColor color = m_pen.color();QColorDialog::getColor(color);if(color.isValid()){
  13. QString str =QString::asprintf("background-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());
  14. ui->btnColor->setStyleSheet(str);}}
  15. QPen DialogPen::getpen(){
  16. m_pen.setStyle(Qt::PenStyle(ui->comboBox->currentIndex()));
  17. m_pen.setWidth(ui->spinBox->value());
  18. QColor color = ui->btnColor->palette().color(QPalette::Button);
  19. m_pen.setColor(color);return m_pen;}
  20. QPen DialogPen::getPen(QPen initPen,bool&ok){
  21. DialogPen* dlg =new DialogPen;
  22. QPen pen;
  23. dlg->setPen(initPen);int ret = dlg->exec();if(ret == QDialog::Accepted){
  24. pen = dlg->getpen();
  25. ok =true;}else{
  26. pen = initPen;
  27. ok =false;}delete dlg;return pen;}voidDialogPen::setPen(const QPen &pen){
  28. m_pen = pen;
  29. ui->spinBox->setValue(pen.width());int i =static_cast<int>(pen.style());
  30. ui->comboBox->setCurrentIndex(i);
  31. ui->btnColor->setAutoFillBackground(true);
  32. QColor color = pen.color();
  33. QString str =QString::asprintf("background-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());
  34. ui->btnColor->setStyleSheet(str);}
mainwindow类

mainwindow.h

  1. #ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QChartView>#include<QtCharts>#include<QColor>#include<QLineSeries>#include<QValueAxis>#include<QtMath>#include<QTime>#include<QChart>#include<QFontDialog>#include"dialogpen.h"
  2. QT_CHARTS_USE_NAMESPACE
  3. QT_BEGIN_NAMESPACE
  4. namespace Ui {classMainWindow;}
  5. QT_END_NAMESPACE
  6. classMainWindow:publicQMainWindow{
  7. Q_OBJECT
  8. public:MainWindow(QWidget *parent =nullptr);~MainWindow();private slots:voidon_actZoomOut_triggered();voidon_actZoomIn_triggered();voidon_actReset_triggered();voidon_actFlush_triggered();voidon_btn_set_clicked();voidon_btn_titleFont_clicked();voidon_rBtn_Up_clicked();voidon_rBtn_Down_clicked();voidon_rBtn_Left_clicked();voidon_rBtn_Right_clicked();voidon_checkBox_legend_clicked(bool checked);voidon_checkBox_legendBG_clicked(bool checked);voidon_pBtn_Font_clicked();voidon_pBtn_legendcolor_clicked();voidon_pBtn_setMargin_clicked();voidon_comboBox_motion_currentIndexChanged(int index);voidon_comboBox_theme_currentIndexChanged(int index);voidon_sin_curve_clicked();voidon_cos_curve_clicked();voidon_pBtn_name_clicked();voidon_checkBox_curve_clicked(bool checked);voidon_checkBox_data_clicked(bool checked);voidon_pBtn_color_clicked();voidon_pBtn_pen_clicked();voidon_horizontalSlider_valueChanged(int value);voidon_checkBox_pointLableVisible_clicked(bool checked);voidon_pushButton_13_clicked();voidon_pushButton_12_clicked();voidon_rBtn_Y_clicked();voidon_rBtn_XY_clicked();voidon_rBtn_XAxies_clicked();voidon_rBtn_YAxies_clicked();voidon_Axis_isVisible_clicked(bool checked);voidon_Axis_range_clicked();voidon_Axis_setTitle_clicked();voidon_Axis_titleIsVisible_clicked(bool checked);voidon_pBtn_style_clicked();voidon_pBtn_Fontcolor_clicked();voidon_pBtn_setFont_clicked();voidon_chk_scaleIsVisible_clicked(bool checked);voidon_chk_gridLineVisible_clicked(bool checked);voidon_pBtn_Fontcolor_2_clicked();voidon_pBtn_Fontcolor_3_clicked();voidon_spinBox_Tickcount_valueChanged(int arg1);voidon_spinBox_minorTickcount_valueChanged(int arg1);voidon_chk_TickLineIsVisible_clicked(bool checked);voidon_pBtn_Fontcolor_5_clicked();voidon_pBtn_Fontcolor_4_clicked();voidon_pBtn_Fontcolor_7_clicked();voidon_pBtn_Fontcolor_6_clicked();voidon_chk_MinorTickLineIsVisible_clicked(bool checked);private:
  9. Ui::MainWindow *ui;voidcreateChart();
  10. QLineSeries* curSeries;
  11. QValueAxis* curAxis;voidprepareData();voidupdateFromChart();};#endif// MAINWINDOW_H

mainwindow.cpp

  1. #include"mainwindow.h"#include"ui_mainwindow.h"#include"ui_dialogPen.h"MainWindow::MainWindow(QWidget *parent):QMainWindow(parent),ui(new Ui::MainWindow){
  2. ui->setupUi(this);createChart();prepareData();updateFromChart();}MainWindow::~MainWindow(){delete ui;}voidMainWindow::on_actZoomOut_triggered(){
  3. ui->cView->chart()->zoom(0.8);}voidMainWindow::on_actZoomIn_triggered(){
  4. ui->cView->chart()->zoom(1.2);}voidMainWindow::on_actReset_triggered(){
  5. ui->cView->chart()->zoomReset();}voidMainWindow::createChart(){
  6. QChart* chart =newQChart();
  7. chart->setTitle("simple curve");
  8. ui->cView->setChart(chart);
  9. ui->cView->setRenderHint(QPainter::Antialiasing);
  10. QLineSeries* series0 =new QLineSeries;
  11. QLineSeries* series1 =new QLineSeries;
  12. series0->setName("sin");
  13. series1->setName("cos");
  14. curSeries = series0;
  15. QPen pen;
  16. pen.setStyle(Qt::DotLine);
  17. pen.setWidth(2);
  18. series0->setPen(pen);
  19. pen.setStyle(Qt::SolidLine);
  20. pen.setColor(Qt::blue);
  21. series1->setPen(pen);
  22. chart->addSeries(series0);
  23. chart->addSeries(series1);
  24. QValueAxis* axisX =new QValueAxis;
  25. QValueAxis* axisY =new QValueAxis;
  26. curAxis = axisX;
  27. axisX->setRange(0,10);
  28. axisX->setLabelFormat("%.1f");
  29. axisX->setTickCount(11);
  30. axisX->setMinorTickCount(4);
  31. axisX->setTitleText("time(secs)");
  32. axisY->setRange(-1.5,1.5);
  33. axisY->setTickCount(3);
  34. axisY->setMinorTickCount(4);
  35. axisY->setTitleText("value");
  36. chart->setAxisX(axisX,series0);
  37. chart->setAxisX(axisX,series1);
  38. chart->setAxisY(axisY,series0);
  39. chart->setAxisY(axisY,series1);}voidMainWindow::prepareData(){
  40. QLineSeries* series0 =(QLineSeries*)ui->cView->chart()->series().at(0);
  41. QLineSeries* series1 =(QLineSeries*)ui->cView->chart()->series().at(1);int cnt =100;
  42. series0->clear();
  43. series1->clear();qsrand(QTime::currentTime().second());
  44. qreal t=0, y1, y2, inv=0.1;
  45. qreal rd;for(int i=0; i<cnt; i++){
  46. rd =(qrand()%10)-5;
  47. y1 =qSin(t)+ rd/50;
  48. series0->append(t,y1);
  49. y2 =qCos(t)+ rd/50;
  50. series1->append(t,y2);
  51. t += inv;}}voidMainWindow::updateFromChart(){
  52. QChart* chart = ui->cView->chart();
  53. ui->lineEdit_title->setText(chart->title());
  54. QMargins mg = chart->margins();
  55. ui->spinBox_Down->setValue(mg.bottom());
  56. ui->spinBox_Left->setValue(mg.left());
  57. ui->spinBox_Right->setValue(mg.right());
  58. ui->spinBox_Up->setValue(mg.top());}voidMainWindow::on_actFlush_triggered(){prepareData();}voidMainWindow::on_btn_set_clicked(){
  59. QChart *chart = ui->cView->chart();
  60. chart->setTitle(ui->lineEdit_title->text());}voidMainWindow::on_btn_titleFont_clicked(){
  61. QFont font = ui->cView->chart()->titleFont();bool ok =false;
  62. font =QFontDialog::getFont(&ok,font);if(ok)
  63. ui->cView->chart()->setTitleFont(font);}voidMainWindow::on_rBtn_Up_clicked(){
  64. ui->cView->chart()->legend()->setAlignment(Qt::AlignTop);}voidMainWindow::on_rBtn_Down_clicked(){
  65. ui->cView->chart()->legend()->setAlignment(Qt::AlignBottom);}voidMainWindow::on_rBtn_Left_clicked(){
  66. ui->cView->chart()->legend()->setAlignment(Qt::AlignLeft);}voidMainWindow::on_rBtn_Right_clicked(){
  67. ui->cView->chart()->legend()->setAlignment(Qt::AlignRight);}voidMainWindow::on_checkBox_legend_clicked(bool checked){
  68. ui->cView->chart()->legend()->setVisible(checked);}voidMainWindow::on_checkBox_legendBG_clicked(bool checked){
  69. ui->cView->chart()->legend()->setBackgroundVisible(checked);}voidMainWindow::on_pBtn_Font_clicked(){
  70. QFont font = ui->cView->chart()->legend()->font();bool ok =false;
  71. font =QFontDialog::getFont(&ok,font);if(ok)
  72. ui->cView->chart()->legend()->setFont(font);}voidMainWindow::on_pBtn_legendcolor_clicked(){
  73. QColor color = ui->cView->chart()->legend()->labelColor();
  74. color =QColorDialog::getColor(color);if(color.isValid())
  75. ui->cView->chart()->legend()->setLabelColor(color);}voidMainWindow::on_pBtn_setMargin_clicked(){
  76. QMargins mgs;
  77. mgs.setTop(ui->spinBox_Up->value());
  78. mgs.setLeft(ui->spinBox_Down->value());
  79. mgs.setLeft(ui->spinBox_Left->value());
  80. mgs.setRight(ui->spinBox_Right->value());
  81. ui->cView->chart()->setMargins(mgs);}voidMainWindow::on_comboBox_motion_currentIndexChanged(int index){
  82. ui->cView->chart()->setAnimationOptions((QChart::AnimationOption)index);}voidMainWindow::on_comboBox_theme_currentIndexChanged(int index){
  83. ui->cView->chart()->setTheme((QChart::ChartTheme)index);}voidMainWindow::on_sin_curve_clicked(){if(ui->sin_curve->isChecked())
  84. curSeries =(QLineSeries*)ui->cView->chart()->series().at(0);else
  85. curSeries =(QLineSeries*)ui->cView->chart()->series().at(1);//获取curSeries的值, 设置(标题名称,序列可见的,点数据可见,透明度滑动条)
  86. ui->lineEdit_title->setText(curSeries->name());
  87. ui->checkBox_curve->setChecked(curSeries->isVisible());
  88. ui->checkBox_data->setChecked(curSeries->pointsVisible());
  89. ui->horizontalSlider->setValue(curSeries->opacity()*10);
  90. ui->checkBox_pointLableVisible->setChecked(curSeries->pointLabelsVisible());}voidMainWindow::on_cos_curve_clicked(){on_sin_curve_clicked();}voidMainWindow::on_pBtn_name_clicked(){
  91. curSeries->setName(ui->line_name->text());}voidMainWindow::on_checkBox_curve_clicked(bool checked){Q_UNUSED(checked)
  92. curSeries->setVisible(ui->checkBox_curve->isChecked());}voidMainWindow::on_checkBox_data_clicked(bool checked){Q_UNUSED(checked)
  93. curSeries->setPointsVisible(ui->checkBox_data->isChecked());}voidMainWindow::on_pBtn_color_clicked(){
  94. QColor color = curSeries->color();
  95. color =QColorDialog::getColor(color);if(color.isValid())
  96. curSeries->setColor(color);}voidMainWindow::on_pBtn_pen_clicked(){bool ok =false;
  97. QPen pen = curSeries->pen();
  98. pen =DialogPen::getPen(pen, ok);if(ok)
  99. curSeries->setPen(pen);}voidMainWindow::on_horizontalSlider_valueChanged(int value){
  100. curSeries->setOpacity(value/10.0);}voidMainWindow::on_checkBox_pointLableVisible_clicked(bool checked){
  101. curSeries->setPointLabelsVisible(checked);}voidMainWindow::on_pushButton_13_clicked(){
  102. QColor color = curSeries->pointLabelsColor();
  103. color =QColorDialog::getColor(color);if(color.isValid())
  104. curSeries->setPointLabelsColor(color);}voidMainWindow::on_pushButton_12_clicked(){
  105. QFont font = curSeries->pointLabelsFont();bool ok =false;
  106. font =QFontDialog::getFont(&ok, font);if(ok)
  107. curSeries->setPointLabelsFont(font);}voidMainWindow::on_rBtn_Y_clicked(){if(ui->rBtn_Y->isChecked())
  108. curSeries->setPointLabelsFormat("@yPoint");else
  109. curSeries->setPointLabelsFormat("(@xPoint,@yPoint)");}voidMainWindow::on_rBtn_XY_clicked(){on_rBtn_Y_clicked();}voidMainWindow::on_rBtn_XAxies_clicked(){// 设置坐标轴
  110. QList<QAbstractAxis*> axes;if(ui->rBtn_XAxies->isChecked())
  111. axes = ui->cView->chart()->axes(Qt::Horizontal);else
  112. axes = ui->cView->chart()->axes(Qt::Vertical);
  113. curAxis =(QValueAxis*)axes[0];//获取坐标轴属性,显示到界面上
  114. ui->dSBox_minV->setValue(curAxis->min());
  115. ui->dSBox_maxV->setValue(curAxis->max());
  116. ui->Axis_title->setText(curAxis->titleText());
  117. ui->Axis_titleIsVisible->setChecked(curAxis->isTitleVisible());
  118. ui->lineEdit_style->setText(curAxis->labelFormat());
  119. ui->chk_scaleIsVisible->setChecked(curAxis->labelsVisible());
  120. ui->chk_gridLineVisible->setChecked(curAxis->isGridLineVisible());
  121. ui->spinBox_Tickcount->setValue(curAxis->tickCount());
  122. ui->chk_TickLineIsVisible->setChecked(curAxis->isLineVisible());
  123. ui->spinBox_minorTickcount->setValue(curAxis->minorTickCount());
  124. ui->chk_MinorTickLineIsVisible->setChecked(curAxis->isMinorGridLineVisible());}voidMainWindow::on_rBtn_YAxies_clicked(){on_rBtn_XAxies_clicked();}voidMainWindow::on_Axis_isVisible_clicked(bool checked){
  125. curAxis->setVisible(checked);}voidMainWindow::on_Axis_range_clicked(){
  126. curAxis->setRange(ui->dSBox_minV->value(), ui->dSBox_maxV->value());}voidMainWindow::on_Axis_setTitle_clicked(){
  127. curAxis->setTitleText(ui->Axis_title->text());}voidMainWindow::on_Axis_titleIsVisible_clicked(bool checked){
  128. curAxis->setTitleVisible(checked);}voidMainWindow::on_pBtn_style_clicked(){
  129. curAxis->setLabelFormat(ui->lineEdit_style->text());}voidMainWindow::on_pBtn_Fontcolor_clicked(){
  130. QColor color = curAxis->labelsColor();
  131. color =QColorDialog::getColor(color);if(color.isValid())
  132. curAxis->setLabelsColor(color);}voidMainWindow::on_pBtn_setFont_clicked(){
  133. QFont font = curAxis->labelsFont();bool ok =false;
  134. font =QFontDialog::getFont(&ok, font);if(ok)
  135. curAxis->setLabelsFont(font);}voidMainWindow::on_chk_scaleIsVisible_clicked(bool checked){
  136. curAxis->setLineVisible(checked);}voidMainWindow::on_chk_gridLineVisible_clicked(bool checked){
  137. curAxis->setGridLineVisible(checked);}voidMainWindow::on_pBtn_Fontcolor_2_clicked(){
  138. QColor color = curAxis->gridLineColor();
  139. color =QColorDialog::getColor(color);if(color.isValid())
  140. curAxis->setGridLineColor(color);}voidMainWindow::on_pBtn_Fontcolor_3_clicked(){bool ok =false;
  141. QPen pen = curAxis->gridLinePen();
  142. pen =DialogPen::getPen(pen, ok);if(ok)
  143. curAxis->setGridLinePen(pen);}voidMainWindow::on_spinBox_Tickcount_valueChanged(int arg1){
  144. curAxis->setTickCount(arg1);}voidMainWindow::on_spinBox_minorTickcount_valueChanged(int arg1){
  145. curAxis->setMinorTickCount(arg1);}voidMainWindow::on_chk_TickLineIsVisible_clicked(bool checked){
  146. curAxis->setLineVisible(checked);}voidMainWindow::on_pBtn_Fontcolor_5_clicked(){bool ok =false;
  147. QPen pen = curAxis->linePen();
  148. pen =DialogPen::getPen(pen, ok);if(ok)
  149. curAxis->setLinePen(pen);}voidMainWindow::on_pBtn_Fontcolor_4_clicked(){
  150. QColor color = curAxis->linePenColor();
  151. color =QColorDialog::getColor(color);if(color.isValid())
  152. curAxis->setLinePenColor(color);}voidMainWindow::on_pBtn_Fontcolor_7_clicked(){
  153. QColor color = curAxis->minorGridLineColor();
  154. color =QColorDialog::getColor(color);if(color.isValid())
  155. curAxis->setMinorGridLineColor(color);}voidMainWindow::on_pBtn_Fontcolor_6_clicked(){bool ok =false;
  156. QPen pen = curAxis->gridLinePen();
  157. pen =DialogPen::getPen(pen, ok);if(ok)
  158. curAxis->setGridLinePen(pen);}voidMainWindow::on_chk_MinorTickLineIsVisible_clicked(bool checked){
  159. curAxis->setMinorGridLineVisible(checked);}
效果演示

在这里插入图片描述

标签: c++ qt ui

本文转载自: https://blog.csdn.net/wsp_1138886114/article/details/123679168
版权归原作者 SongpingWang 所有, 如有侵权,请联系我们删除。

“Qt(十三)QChart绘制折线图”的评论:

还没有评论