C++曲线图折线图Qt窗体绘图

 C++曲线图折线图Qt窗体绘图

曲线图可自由切换在相同布局窗口中,Excel数据导入生成曲线图,根据需要可修改为直方图,饼图,散点图等。

运行结果如下:

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

QChartView是显示图标的视图,基类为QGraphicsView
QChart的基类是QGraphicsltem
类的继承关系:

创建项目:.pro文件中添加:QT += charts
 

步骤:

第一步:安S,QT

第二步:新建项目

第三步:导入代码文件

第四步:运行

主要代码:

#include <QtCharts>
#include <iostream>
#include <qDebug>
#include <math.h>
using namespace std;

#include "MainWindow.h"

//
#include <QtCharts/QLineSeries>
#include <QtCharts/QSplineSeries>
#include <QPainter>



MainWindow::MainWindow(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);


	//QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(drawDisplay()));

    connect(ui.pushButton, &QPushButton::clicked, this, [=]()
        {
            /// 添加以下代码
            //QLineSeries* series = new QLineSeries();
            series->setPoints(true); // 设置数据点可见
            *series 
                << QPointF(11, 1)
                << QPointF(13, 3)
                << QPointF(17, 6)
                << QPointF(18, 3)
                << QPointF(20, 2);


            chart->legend()->hide();
            chart->addSeries(series);
            chart->createDefaultAxes();
            chart->setTitle("Simple line chart example");

            ui.graphicsView->setRenderHint(QPainter::Antialiasing);

        });


}


void QtChartZoomView::mouseMoveEvent(QMouseEvent *pEvent)
{
	if (m_bMiddleButtonPressed)
	{
		QPoint oDeltaPos = pEvent->pos() - m_oPrePos;
		this->chart()->scroll(-oDeltaPos.x(), oDeltaPos.y());
		m_oPrePos = pEvent->pos();
	}
	__super::mouseMoveEvent(pEvent);
}
void QtChartZoomView::mousePressEvent(QMouseEvent *pEvent)
{
	if (pEvent->button() == Qt::MiddleButton)
	{
		m_bMiddleButtonPressed = true;
		m_oPrePos = pEvent->pos();
		this->setCursor(Qt::OpenHandCursor);
	}
	__super::mousePressEvent(pEvent);
}
void QtChartZoomView::mouseReleaseEvent(QMouseEvent *pEvent)
{
	if (pEvent->button() == Qt::MiddleButton)
	{
		m_bMiddleButtonPressed = false;
		this->setCursor(Qt::ArrowCursor);
	}
	__super::mouseReleaseEvent(pEvent);
}
void QtChartZoomView::wheelEvent(QWheelEvent *pEvent)
{
	qreal rVal = std::pow(0.999, pEvent->delta()); // 设置比例
	// 1. 读取视图基本信息
	QRectF oPlotAreaRect = this->chart()->plotArea();
	QPointF oCenterPoint = oPlotAreaRect.center();
	// 2. 水平调整
	oPlotAreaRect.setWidth(oPlotAreaRect.width() * rVal);
	// 3. 竖直调整
	oPlotAreaRect.setHeight(oPlotAreaRect.height() * rVal);
	// 4.1 计算视点,视点不变,围绕中心缩放
	//QPointF oNewCenterPoint();
	// 4.2 计算视点,让鼠标点击的位置移动到窗口中心
	//QPointF oNewCenterPoint(pEvent->pos());
	// 4.3 计算视点,让鼠标点击的位置尽量保持不动(等比换算,存在一点误差)
	QPointF oNewCenterPoint(2 * oCenterPoint - pEvent->pos() - (oCenterPoint - pEvent->pos()) / rVal);
	// 5. 设置视点
	oPlotAreaRect.moveCenter();
	// 6. 提交缩放调整
	this->chart()->zoomIn(oPlotAreaRect);
	__super::wheelEvent(pEvent);
}

运行结果如下:

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
折线图滤波算法是一种用于平滑和去除噪声的算法,常用于信号处理和数据分析中。在C++ Qt中,可以使用Qt Charts模块来实现折线图的绘制和滤波算法的应用。 以下是一个使用C++ Qt绘制折线图并应用滤波算法的示例代码[^1]: ```cpp #include <QtWidgets/QApplication> #include <QtWidgets/QMainWindow> #include <QtCharts/QChartView> #include <QtCharts/QLineSeries> #include <QtCharts/QValueAxis> #include <QtCharts/QSplineSeries> QT_CHARTS_USE_NAMESPACE int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建折线图系列 QLineSeries *series = new QLineSeries(); series->append(0, 6); series->append(2, 4); series->append(3, 8); series->append(7, 4); series->append(10, 5); // 创建滤波后的折线图系列 QSplineSeries *filteredSeries = new QSplineSeries(); for (int i = 0; i < series->count(); i++) { // 应用滤波算法,例如移动平均滤波 qreal filteredValue = (series->at(i).y() + series->at(i+1).y() + series->at(i+2).y()) / 3; filteredSeries->append(series->at(i).x(), filteredValue); } // 创建图表视图 QChart *chart = new QChart(); chart->addSeries(series); chart->addSeries(filteredSeries); chart->createDefaultAxes(); chart->setTitle("Line Chart with Filtered Series"); // 创建主口 QMainWindow window; QChartView *chartView = new QChartView(chart); window.setCentralWidget(chartView); window.resize(400, 300); window.show(); return a.exec(); } ``` 这段代码使用了Qt Charts模块来创建一个折线图,并应用了滤波算法(这里使用了移动平均滤波)来生成滤波后的折线图系列。最终将图表显示在一个主口中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荷塘月色2

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值