【QT】VS2017+QT使用QCustomPlot绘图

1. 前言

QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.hqcustomplot.cpp文件即可使用。

官方网址:https://www.qcustomplot.com/

下面是运行的效果如下:
在这里插入图片描述

2. 下载QCustomPlot的源码

源码下载地址:https://www.qcustomplot.com/index.php/download
在这里插入图片描述

3. 将QCustomPlot添加到QT项目

qcustomplot.hqcustomplot.cpp2个文件添加到QT项目,如下:
在这里插入图片描述
在项目属性Qt Project Settings中,添加QT模块printsupport,如下:
在这里插入图片描述
在ui布局文件添加一个Widget,然后选择提升为...,如下:
在这里插入图片描述
在弹框提升的类名称中,填写QCustomPlot,然后选择添加
在这里插入图片描述
编译工程,运行效果如下:
在这里插入图片描述

4. 移植QCustomPlot Demo中的plots

解压QCustomPlot.tar.gz后,将qcustomplot\examples\plots移植到当前工程。通过修改setupDemo()来选择测试的demo,部分源码如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
	setGeometry(400, 250, 542, 390);

	setupDemo(12);
	//setupPlayground(ui.customPlot);
	// 0:  setupQuadraticDemo(ui.customPlot);
	// 1:  setupSimpleDemo(ui.customPlot);
	// 2:  setupSincScatterDemo(ui.customPlot);
	// 3:  setupScatterStyleDemo(ui.customPlot);
	// 4:  setupScatterPixmapDemo(ui.customPlot);
	// 5:  setupLineStyleDemo(ui.customPlot);
	// 6:  setupDateDemo(ui.customPlot);
	// 7:  setupTextureBrushDemo(ui.customPlot);
	// 8:  setupMultiAxisDemo(ui.customPlot);
	// 9:  setupLogarithmicDemo(ui.customPlot);
	// 10: setupRealtimeDataDemo(ui.customPlot);
	// 11: setupParametricCurveDemo(ui.customPlot);
	// 12: setupBarChartDemo(ui.customPlot);
	// 13: setupStatisticalDemo(ui.customPlot);
	// 14: setupSimpleItemDemo(ui.customPlot);
	// 15: setupItemDemo(ui.customPlot);
	// 16: setupStyledDemo(ui.customPlot);
	// 17: setupAdvancedAxesDemo(ui.customPlot);
	// 18: setupColorMapDemo(ui.customPlot);
	// 19: setupFinancialDemo(ui.customPlot);
	// 20: setupPolarPlotDemo(ui.customPlot);

	// for making screenshots of the current demo or all demos (for website screenshots):
	//QTimer::singleShot(1500, this, SLOT(allScreenShots()));
	//QTimer::singleShot(4000, this, SLOT(screenShot()));
}

void MainWindow::setupDemo(int demoIndex)
{
	switch (demoIndex)
	{
	case 0:  setupQuadraticDemo(ui.customPlot); break;
	case 1:  setupSimpleDemo(ui.customPlot); break;
	case 2:  setupSincScatterDemo(ui.customPlot); break;
	case 3:  setupScatterStyleDemo(ui.customPlot); break;
	case 4:  setupScatterPixmapDemo(ui.customPlot); break;
	case 5:  setupLineStyleDemo(ui.customPlot); break;
	case 6:  setupDateDemo(ui.customPlot); break;
	case 7:  setupTextureBrushDemo(ui.customPlot); break;
	case 8:  setupMultiAxisDemo(ui.customPlot); break;
	case 9:  setupLogarithmicDemo(ui.customPlot); break;
	case 10: setupRealtimeDataDemo(ui.customPlot); break;
	case 11: setupParametricCurveDemo(ui.customPlot); break;
	case 12: setupBarChartDemo(ui.customPlot); break;
	case 13: setupStatisticalDemo(ui.customPlot); break;
	case 14: setupSimpleItemDemo(ui.customPlot); break;
	case 15: setupItemDemo(ui.customPlot); break;
	case 16: setupStyledDemo(ui.customPlot); break;
	case 17: setupAdvancedAxesDemo(ui.customPlot); break;
	case 18: setupColorMapDemo(ui.customPlot); break;
	case 19: setupFinancialDemo(ui.customPlot); break;
	case 20: setupPolarPlotDemo(ui.customPlot); break;
	}
	setWindowTitle("QCustomPlot: " + demoName);
	statusBar()->clearMessage();
	currentDemoIndex = demoIndex;
	ui.customPlot->replot();
}

运行效果如下:
在这里插入图片描述

5. 移植过程出现的问题

问题1:编译时的错误log

1>ui_qtwidgetsapplication1.h(15): fatal error C1083: 无法打开包括文件: “qcustomplot.h”: No such file or directory (编译源文件 main.cpp)
1>ui_qtwidgetsapplication1.h(15): fatal error C1083: 无法打开包括文件: “qcustomplot.h”: No such file or directory (编译源文件 QtWidgetsApplication1.cpp)

解决办法:
在这里插入图片描述

因为和工程在同一个目录,设置头文件路径如下:打开项目属性 -> C/C++ -> 常规 -> 附加包含目录 -> $(ProjectDir)
在这里插入图片描述
问题2:编译时的错误log

1>qcustomplot.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall QPrinter::QPrinter(enum QPrinter::PrinterMode)" (??0QPrinter@@QAE@W4PrinterMode@0@@Z),该符号在函数 "public: bool __thiscall QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QAE_NABVQString@@HHW4ExportPen@QCP@@00@Z) 中被引用
1>qcustomplot.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall QPrinter::~QPrinter(void)" (??1QPrinter@@UAE@XZ),该符号在函数 "public: bool __thiscall QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QAE_NABVQString@@HHW4ExportPen@QCP@@00@Z) 中被引用
1>qcustomplot.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall QPrinter::setOutputFormat(enum QPrinter::OutputFormat)" (?setOutputFormat@QPrinter@@QAEXW4OutputFormat@1@@Z),该符号在函数 "public: bool __thiscall QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QAE_NABVQString@@HHW4ExportPen@QCP@@00@Z) 中被引用
1>qcustomplot.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall QPrinter::setOutputFileName(class QString const &)" (?setOutputFileName@QPrinter@@QAEXABVQString@@@Z),该符号在函数 "public: bool __thiscall QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QAE_NABVQString@@HHW4ExportPen@QCP@@00@Z) 中被引用
1>qcustomplot.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall QPrinter::setColorMode(enum QPrinter::ColorMode)" (?setColorMode@QPrinter@@QAEXW4ColorMode@1@@Z),该符号在函数 "public: bool __thiscall QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QAE_NABVQString@@HHW4ExportPen@QCP@@00@Z) 中被引用
1>qcustomplot.obj : error LNK2019: 无法解析的外部符号 "public: class QPrintEngine * __thiscall QPrinter::printEngine(void)const " (?printEngine@QPrinter@@QBEPAVQPrintEngine@@XZ),该符号在函数 "public: bool __thiscall QCustomPlot::savePdf(class QString const &,int,int,enum QCP::ExportPen,class QString const &,class QString const &)" (?savePdf@QCustomPlot@@QAE_NABVQString@@HHW4ExportPen@QCP@@00@Z) 中被引用

解决办法:
打开项目属性 -> Qt Project Settings -> Qt Modules -> 增加printsupport
在这里插入图片描述

5. 测试demo完整工程

测试时的完成工程代码下载路径如下:
https://download.csdn.net/download/ZHONGCAI0901/20964210?spm=1001.2014.3001.5501

如果不使用QCustomPlot库或Qt Charts模块,我们可以使用Qt自带的绘图类QPainter来实现绘制柏拉图。 以下是一个简单的绘制柏拉图的示例代码: ```cpp void Widget::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); // 设置画笔 painter.setPen(QPen(Qt::black, 2)); // 绘制坐标轴 painter.drawLine(QPointF(50, 250), QPointF(450, 250)); painter.drawLine(QPointF(50, 250), QPointF(50, 50)); // 绘制坐标轴上的标记和文字 painter.drawText(QPointF(43, 265), "0"); painter.drawText(QPointF(33, 255), "-"); painter.drawText(QPointF(43, 55), "0"); painter.drawText(QPointF(33, 245), "-"); painter.drawText(QPointF(450, 265), "x"); painter.drawText(QPointF(30, 50), "y"); // 绘制柏拉图数据点 QList<QPointF> points; points << QPointF(100, 200) << QPointF(200, 150) << QPointF(300, 100) << QPointF(400, 50); painter.setPen(QPen(Qt::red, 5)); painter.setBrush(QBrush(Qt::red)); for (int i = 0; i < points.size(); i++) { painter.drawEllipse(points.at(i), 5, 5); } // 绘制柏拉图线段 painter.setPen(QPen(Qt::blue, 2)); for (int i = 0; i < points.size() - 1; i++) { painter.drawLine(points.at(i), points.at(i + 1)); } } ``` 在这个示例中,我们首先在paintEvent()函数中创建了一个QPainter对象,然后设置画笔和画刷,绘制坐标轴和标记文字。接着,我们定义了一个QList<QPointF>对象,用于存储柏拉图的数据点,然后通过for循环绘制每个数据点。最后,我们再次使用for循环,绘制柏拉图的线段。 当我们调用QWidget::update()函数时,paintEvent()函数就会被自动调用,从而完成柏拉图的绘制。 需要注意的是,这个示例只是一个简单的柏拉图绘制示例,实际应用中还需要根据具体需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值