栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【小白入门】Qt界面设计:利用QChart显示折线图(QT+VS C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【小白入门】Qt界面设计:利用QChart显示折线图(QT+VS C++)

【Qt软件设计(C++)】 利用QChart显示折线图
  • QChart
    • 写在前面(可以不看)
    • 属性与配置
      • 附加包含目录
      • 显示QChart
      • 添加曲线

本文仅梳理总结自己在学习过程中的一些理解和思路,水平有限,理解粗鄙浅薄且不一定正确。文章所有观点均不保证绝对正确,请酌情参考。如果各位朋友发现任何错误请及时告诉我,大家一起讨论共同提高。
版本:QT 5.8.0+VS2013
(我的意思是如果使用其他版本出现各种问题的话,来问我也大概率没办法帮你解决问题,因为我是一只菜狗)

QChart 写在前面(可以不看)

全网教程全部都是使用的QTCreate!(并不!)
而且完全无法运行!(因为我菜)
别以为我不知道你们都是从书上抄来的然后互相复制的嘤嘤嘤(对不起这只是因为我太菜而发出的暴言,请各位大佬不要生气!)
本菜狗本着我菜菜一个,我会教一窝(?)的奉献精神(x),把我个人成功编译并运行,使用QChart实现显示简单折线图的全过程记录下来,希望能够帮助到其他有此需求的朋友(和马上就会光速忘记这个过程的未来的我本人)

属性与配置

新建带GUI界面的简单QT项目,或打开已有的项目。
直接复制书上/网上的代码或直接新建对象,编译器会提示“未定义表示符”,添加include语句也一样表示找不到此文件。这是因为QChart并未被包含在新建项目默认自带的控件库中,其路径和链接库也同样需要自己进行配置。QT中类似情况的功能控件还有很多,也可以同样使用本文的方法进行配置。

附加包含目录

解决方案资源管理器 》》工程名》》右键属性》》C++》》附加包含目录
这里需要填写头文件放置的位置,可以看到,新建工程的时候编译器已经悄悄帮我们把Gui,Core等几个常用的,新建时勾选了的库地址放进来了,这也就是我们为什么直接include头文件使用Pushbutton,massageBox之类常用控件。

在QT的安装路径文件夹下可以找到include文件夹,其中又分门别类的放置了多个文件夹,用来放置各类头文件,将QChart文件夹路径添加进来,完成附加包含目录的配置。这时,会发现include不再报错了。
使用QChart需要的头文件为#include
(记得debuge和release的属性里面都要添加,或直接修改所有配置)

完成此步之后,相当于只声明了变量,却没有添加定义,因为还没有添加库文件。此时运行会报错“无法解析的外部符号”
解决方案资源管理器 》》工程名》》右键属性》》连接器》》输入
在这里添加包含类定义的.lib文件的文件名

注意,这里debug和release中配置的.lib文件是不同的,通常debug的.lib文件名中比release的.lib文件名多个字母d或者ed,一定要注意区分,不要添加错误。如果加错了编译器是不会报错的,但运行时会产生“地址冲突”或“未经处理的异常”

到这里配置就完成了,就可以正常使用QChart了

显示QChart

QChart需要放在QChartView中显示。
创建QChartView有两种办法,一种就是网上常见的利用代码创建。

QChartView *chartView = new QChartView(this);

但是这种方法需要使用代码设定显示窗口大小和位置,最大的缺点就是不够直观。我们也希望能够像使用TableView一样通过在UI界面中拖动来布局。但我们在UI的编辑界面中是找不到这个控件的。
这个问题的解决方案其实书里也写到了~~(两行小字,一开始完全没看见)~~

其实并不严格要求放置QGraphicsView,亲测widget也是可以的。右键控件选择“提升为”,提升的类名称为QChartView

这样就可以实现UI界面的编辑了。

添加曲线

这部分就直接放代码了,一看就能看懂。

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

	createChart();
	ui.widget->setChart(chart);
}


vtkLines::~vtkLines()
{

}

void vtkLines::createChart()
{ 
	//创建图表
	chart = new QChart(); //创建 Chart
	chart->setTitle(QString::fromStdWString(L"简单函数曲线"));

	//创建曲线序列
	QLineSeries *series0 = new QLineSeries();
	QLineSeries *series1 = new QLineSeries();
	series0->setName(QString::fromStdWString(L"Sin曲线"));
	series1->setName(QString::fromStdWString(L"Cos曲线"));
	chart->addSeries(series0); //序列添加到图表
	chart->addSeries(series1);

	QPen pen;
	pen.setStyle(Qt::DotLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
	pen.setWidth(2);
	pen.setColor(Qt::red);
	series0->setPen(pen);

	pen.setStyle(Qt::SolidLine);//Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine
	pen.setColor(Qt::blue);
	series1->setPen(pen);

	//序列添加数值
	double   t = 0, y1, y2, intv = 0.1;
	int cnt = 100;
	for (int i = 0; iappend(t, y1);

		y2 = qSin(t + 20);
		series1->append(t, y2);

		t += intv;
	}


	chart->createDefaultAxes();
	chart->axisX()->setTitleText("time(secs)");
	chart->axisY()->setTitleText("value");

	//创建坐标轴
	QValueAxis *axisX = new QValueAxis; //X 轴
	axisX->setRange(0, 10); //设置坐标轴范围
	axisX->setLabelFormat("%.1f"); //标签格式
	axisX->setTickCount(11); //主分隔个数
	axisX->setMinorTickCount(4);
	axisX->setTitleText("time(secs)"); //标题
	//    axisX->setGridLineVisible(false);

	QValueAxis *axisY = new QValueAxis; //Y 轴
	axisY->setRange(-2, 2);
	axisY->setTitleText("value");
	axisY->setTickCount(5);
	axisY->setMinorTickCount(4);
	axisY->setLabelFormat("%.2f"); //标签格式
	axisY->setGridLineVisible(false);

	chart->setAxisX(axisX, series0); //为序列设置坐标轴
	chart->setAxisY(axisY, series0); //

	chart->setAxisX(axisX, series1); //为序列设置坐标轴
	chart->setAxisY(axisY, series1); //
}

样例代码我打包放在 QChart显示折线图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352475.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号