• Qt Chats(一)绘制折线图


    1、一个简单的QChart绘图程序

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

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

    QChart类继承关系

     QPolarChart 用于绘制 极坐标图的图表类

    1.项目中使用Qt Charts模块,在.pro中添加 : Qt     +=charts

    在头文件或原文件添加:

    #include

    using namespace QtCharts; 也可用宏定义  Qt_CHARTS_USE_NAMESPACE

    2.mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. MainWindow::MainWindow(QWidget *parent)
    7. : QMainWindow(parent)
    8. {
    9. //ui->setUI(this);
    10. createChart();
    11. resize(600,400);
    12. setWindowTitle("QChart简单绘图");
    13. }
    14. MainWindow::~MainWindow()
    15. {
    16. }
    17. void MainWindow::createChart()
    18. {
    19. //创建图表
    20. QChartView *chartview=new QChartView(this);
    21. QChart *chart=new QChart();
    22. chart->setTitle(QStringLiteral("简单函数曲线"));
    23. chartview->setChart(chart);//将chart添加到chartview中
    24. setCentralWidget(chartview);
    25. //创建折线序列
    26. QLineSeries *series0=new QLineSeries();
    27. QLineSeries *series1=new QLineSeries();
    28. series0->setName(QStringLiteral("Sin曲线"));
    29. series1->setName(QStringLiteral("Cos曲线"));
    30. chart->addSeries(series0);//将序列添加到图表
    31. chart->addSeries(series1);
    32. //序列添加数值
    33. qreal t =0,y1,y2,intv=0.1;
    34. int cnt=100;
    35. for(int i=0;i
    36. {
    37. y1=qSin(t);
    38. series0->append(t,y1);
    39. y2=qSin(t+20);
    40. series1->append(t,y2);
    41. t+=intv;
    42. }
    43. //创建坐标轴
    44. QValueAxis *axisX=new QValueAxis;
    45. axisX->setRange(0,10);
    46. axisX->setTitleText("time(secs)");
    47. QValueAxis *axisY=new QValueAxis;
    48. axisY->setRange(-2,2);
    49. axisY->setTitleText("value");
    50. chart->setAxisX(axisX,series0);//为序列添加坐标轴
    51. chart->setAxisY(axisY,series0);
    52. chart->setAxisX(axisX,series1);
    53. chart->setAxisY(axisY,series1);
    54. }

    效果:

    3.图表的主要组成部分

    QChart一般包括 序列、坐标轴、图例、图表标题等。

    1.QChartView 的功能

    QChartView是QChart的视图组件,类似于Graphics View架构中的QGraphics View。在窗口设计界面上使用QChartView时,就是先放置一个QGraphics View组件,然后提升为QChartView。

    QChartView定义的类函数:

    • void setChart(QChart *chart),设置一个QChart对象作为显示的图表
    • QChart *chart()返回QChartView当前设置的QChart类对象
    • void setRubberBand(RubberBand& rubberBand),设置选择框的类型,即鼠标在视图组件上拖动选择的范围的方式。      

         QChartView::RubberBand枚举类型取值有: 

    1.  QChartView::NoRubberBand          无选择框 
    2. QChartView::VerticalRubberBand         垂直选择框
    3. QChartView::HorizontalRubberBand        水平选择框
    4. QChartView::RectangleRubberBand          矩形选择框
    • rubberBands rubberBand()  返回设置的选择框类型 

    2.序列

     序列是数值的表现形式。案例中的两条曲线QLineSeries。图表的类型主要由序列的类型决定的,常见的图表类型如下:

    Qt Charts常见图表及用到的序列类(图片来自Qt帮助文档)
    柱状图QBarSeries水平柱状图 QHorizontalBarSeries
    百分比柱状图 QPercentBarSeries水平百分比柱状图 QHorizontalPercentBarSeries
    堆叠柱状图QStackedBarSeries水平堆叠柱状图QHorizontalStackedBarSeries
    火柴盒图QBoxPlotSeries饼图QPieSeries
    折线图 QLineSeries光滑曲线图QSplineSeries
    散点图QScatterSeries面积图QAreaSeries

     序列的继承关系如图

     3.坐标轴 

    坐标轴类封装了坐标轴的刻度、标签、网格线、标题等。

    坐标轴类继承关系

    4.图例

    图例(Legend)是对图表上显示的序列的示例说明。如:

    有线条颜色和文字说明。QLegend是封装了图例控制类功能的类,可以为每个序列设置图例中的文字,可以控制图例显示在图表的上下左右不同位置。图例是根据添加的序列自动生成的,但是也可以修改图例的一些属性。对于图例QLegendMarker,可以为每个序列的图例生成一个类似于QCheckBox的组件,在图例上单击序列的标记,可以控制序列是否显示。

    2.稍复杂的QChart绘图程序

    首先新建DialogPen用于设置一些对象pen属性

    所以就可以自行绘制相应的pen控件

    界面如图

    DialogPen.h

    1. #ifndef DIALOGPEN_H
    2. #define DIALOGPEN_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. namespace Ui {
    9. class DialogPen;
    10. }
    11. class DialogPen : public QDialog
    12. {
    13. Q_OBJECT
    14. public:
    15. explicit DialogPen(QWidget *parent = nullptr);
    16. ~DialogPen();
    17. QPen getpen(); //获取对话框设置的Qpen的属性
    18. static QPen getPen(QPen initPen, bool &ok); //静态函数
    19. void setPen(const QPen &pen);//设置pen,用于对话框界面的显示
    20. private slots:
    21. void on_pushButtoncolor_clicked();
    22. private:
    23. Ui::DialogPen *ui;
    24. QPen m_pen;
    25. };
    26. #endif // DIALOGPEN_H

    DialogPen.cpp

    1. #include "dialogpen.h"
    2. #include "ui_dialogpen.h"
    3. DialogPen::DialogPen(QWidget *parent) :
    4. QDialog(parent),
    5. ui(new Ui::DialogPen)
    6. {
    7. ui->setupUi(this);
    8. ui->comboBoxStyle->clear();
    9. ui->comboBoxStyle->addItem("NoPen",0);
    10. ui->comboBoxStyle->addItem("SolidLine",1);
    11. ui->comboBoxStyle->addItem("DashLine",2);
    12. ui->comboBoxStyle->addItem("DotLine",3);
    13. ui->comboBoxStyle->addItem("DashDotLine",4);
    14. ui->comboBoxStyle->addItem("DashDotDotLine",5);
    15. ui->comboBoxStyle->addItem("CustomDashLine",6);
    16. ui->comboBoxStyle->setCurrentIndex(0);
    17. }
    18. DialogPen::~DialogPen()
    19. {
    20. delete ui;
    21. }
    22. //获得设置的属性
    23. QPen DialogPen::getpen()
    24. {
    25. m_pen.setStyle(Qt::PenStyle(ui->comboBoxStyle->currentIndex())); //线型
    26. m_pen.setWidth(ui->spinBoxWidth->value());//线宽
    27. QColor color=ui->pushButtoncolor->palette().color(QPalette::Button);
    28. m_pen.setColor(color); //颜色
    29. return m_pen;
    30. }
    31. //静态函数,获取QPen
    32. QPen DialogPen::getPen(QPen initPen, bool &ok)
    33. {
    34. DialogPen * dlg = new DialogPen;//创建一个对话框
    35. dlg->setPen(initPen); //设置初始化QPen
    36. QPen pen;
    37. int ret = dlg->exec(); //弹出对话框
    38. if (ret == QDialog::Accepted)
    39. {
    40. pen = dlg->getpen();//获取
    41. ok = true;
    42. }
    43. else
    44. {
    45. pen = initPen;
    46. ok = false;
    47. }
    48. delete dlg; //删除对话框对象
    49. return pen; //返回设置的QPen对象
    50. }
    51. //设置pen,并刷新显示界面
    52. void DialogPen::setPen(const QPen &pen)
    53. {
    54. m_pen=pen;
    55. ui->spinBoxWidth->setValue(pen.width());
    56. int i=static_cast<int>(pen.style()); //枚举类型转换为整形
    57. ui->comboBoxStyle->setCurrentIndex(i);
    58. QColor color=pen.color();
    59. ui->pushButtoncolor->setAutoFillBackground(true); //设置按钮的背景颜色
    60. QString str=QString::asprintf(("background-color:rgb(%d,%d,%d)"),color.red(),color.green(),color.blue());
    61. ui->pushButtoncolor->setStyleSheet(str);
    62. }
    63. void DialogPen::on_pushButtoncolor_clicked()
    64. {
    65. QColor color = m_pen.color();
    66. QColorDialog::getColor(color);
    67. if(color.isValid())
    68. {
    69. QString str = QString::asprintf("background-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());
    70. ui->pushButtoncolor->setStyleSheet(str);
    71. }
    72. }

    注:静态函数创建一个dlg实例,然后调用 dlg->setPen(initPen)进行初始化设置,运行对话框并获取返回状态,如果返回类型为 QDialog::Accepted,就调用  pen = dlg->getpen()获取设置属性后的QPen的对象,最后删除对话框并删除设置的QPen对象。

    现在绘制主界面(设置主界面时,没有设置好布局,导致后面出来的图丑,懒得去改了)

    maindow.h

  • 相关阅读:
    java毕业设计eonvan数字工坊网站mybatis+源码+调试部署+系统+数据库+lw
    [UEFI]SHELL命令汇总
    keycloak~网站对接到Keycloak的步骤
    selenium4自动化测试
    orangepi 香橙派-实时时钟模块使用DS1307/DS3231/PCF8563
    web渗透测试----5、暴力破解漏洞--(1)SSH密码破解
    射频测试设备编程指南——射频移相器
    硅芯思见:【143】问芯吾跬(IC设计验证常见问题汇总二)
    趣味算法一棋盘的麦子
    FFplay文档解读-42-视频过滤器十七
  • 原文地址:https://blog.csdn.net/m0_75179090/article/details/132943050