VS+Qt配置QCharts,建立坐标轴,画图形

在Qt 和VS 两者中均可以使用QChart,我在这里是用VS上的Qt。

Qt里:

如果只在Qt使用的话,需要QT跟新组件加入QChart。然后在.pro配置文件中加入 QT += charts 并在使用的.h头文件上边加上 using namespace Qtcharts或者一个宏 QT_CHARTS_USE_NAMESPACE

VS里:

在VS上的话,需要配置一下,详细过程方参考:
(其实就是把显示的widget 提升为 QChartView, 然后配置一下路径即可)
https://blog.csdn.net/qq_28080659/article/details/78914373

在头文件.h中

加上这三个:

#include <QtCharts>
#include <QChartView>
#include <QLineSeries>

如果使用一个线条的话,直接
QLineSeries*series;
如果好几个线条的话,用数组
*QList<QLineSeries >seriesArr;
其他图形原理一样。 这个series就是就坐标轴上的那个图形(可以是线条,也可以是柱状图等等,记住,其实就2个东西,一个是画坐标轴,另一个是在坐标轴上显示你要的数据图)

接下来在.cpp文件中

  1. 创建一个QChart, 并把标签隐藏掉。隐藏不隐藏无所谓,个人喜好。
	QChart *chart = new QChart();
	chart->legend()->hide();
  1. 然后画数据线条,就是你想在你的chart上显示的图形,刚刚我们在.h文件中声明的那个series,现在拿过来用就好(先一个线条)。
series->append(0.0);
series->append(1,1); //坐标x,y为 (0, 0)和(1,1)两个点的连线。

若果你想加线条宽度和颜色 ,就用setPen

series->setPen(QPen(Qt::blue, 8, Qt::SolidLine)); //颜色是蓝色,宽度是8.
  1. 现在数据线条画好了,把他加到chart当中。
chart->addSeries(series);
chart->createDefaultAxes();   //不加这个默认坐标不行的。

这里我还是建议你自己画个坐标轴,这样子对X,Y轴处理比较方便。坐标轴操作如下:

//set X axis
	QValueAxis *axisX = new QValueAxis();
	axisX->setTickCount(7); //这个是间隔数量,就是在范围的tick数量。
	axisX->setRange(-10, 10); //这里是x轴的范围,从-10到10.
	axisX->setLabelFormat("%d"); //显示标签的形式,我这里设置为整数。
	axisX->setTitleText("x轴的title");
	axisX->setTitleBrush(QBrush(Qt::white)); //设置title的颜色
	axisX->setLabelsColor(Qt::white);  //设置X轴的label颜色
	axisX->setGridLineVisible(false);  //显示网格与否。
	chart->setAxisX(axisX, series);  // 把以上所设定的X轴的东西 全部加到chart里!!!!
	
	//set Y axis   这里设置y轴,其实和上边的原理一样。
	QValueAxis *axisY = new QValueAxis();
	axisY->setTickCount(23);  
	axisY->setRange(-20, 200);
	axisY->setLabelFormat("%d");
	axisY->setLabelsColor(Qt::white);
	axisY->setGridLineVisible(false);
	chart->setAxisY(axisY, series);

然后把这个chart,显示在ui界面中的里边,(就是此文章最上边,你在ui界面中提升的那个wiget为QChartView的东西)

//若果你想设置一下你画的这个chart背景颜色就用:
chart->setBackgroundBrush(Qt::black);
ui->chartPic->setChart(chart);

总结一下,其实很简单:

  1. 画数据图(可以是线条,柱状图,大饼图等)
  2. 设置坐标
  3. 创建一个QChart * chart 然后把1和2的东西加到chart里。
    chart->addSeries(…) 和 chart->setAxisX(…) , chart->setAxisY(…)
  4. 在你想要的ui位置里显示就好了。

Note:其他样式的图,原理都是这样子的哦。 可以百度查查看如何声明和使用其他图形。

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源为Qt绘图基础,世界坐标系转换为逻辑坐标系。世界坐标系原点在视图左上角,本例子通过世界坐标转换,将坐标原点定位在视图中央,Y轴向上,X轴向右,并绘制坐标轴,基于逻辑坐标系下的绘图,可将转换关系函数取消生效,对比世界坐标系下的绘图。 重写PainterEvent函数: void QtPixPainter::paintEvent(QPaintEvent* event) { QPainter painter(this); // 反走样 painter.setRenderHint(QPainter::Antialiasing, true); //物理坐标系与逻辑坐标系的转换,如果不转换,下面的绘图都是在世界坐标系下 setWorldTransform(painter); // 其他一些绘制矩,多边的例子,经过上面转换,都是在逻辑坐标系下 drawRectScale(painter); //draw_shearRect(painter); //利用rotate()函数进行比例变换,实现缩放效果 //draw_rotate_act(painter); //draw_by_save_restore(painter); //transform_draw_SinX(painter); transform_draw(painter); local_drawConvexPolygon(painter); } // 将世界坐标(原点左上角)转换为逻辑坐标(原点在屏幕中间) QPointF QtPixPainter::mapToScene(const QPointF& point) { QTransform transMatrix = _transform.inverted(); //翻转矩阵? return transMatrix.map(point); //将点piont映射到transMatrix定义的坐标系中来 } // 将鼠标的逻辑位置返回并以标签式展示 void QtPixPainter::mouseMoveEvent(QMouseEvent* event) { QString msg; QPointF mouse_po = mapToScene(event->pos()); //总是返回屏幕物理坐标系 double x = mouse_po.x(); // 总是返回屏幕物理坐标系 double y = mouse_po.y(); QString str = "(" + QString::number(x) + "," + QString::number(y) + ")"; //qDebug()<<"world x = "<pos().x()<<",world y = "<pos().y(); m_mouse_lable->setText(str); }
该控件继承QWidget, 实现了左右上下四种式的坐标轴控件。 可以设置固定间隔或自动选择间隔 可以设置最小间隔 开放一个槽来动态调整坐标轴的范围 处理了边缘刻度的显示 /************************************************************************ * 版权所有 (C) 2012-2015, [email protected] 类声明: 坐标轴控件 ************************************************************************/ /** @brief 坐标轴控件 * * @details 坐标轴控件 只有刻度和数字,数字可以隐藏(用来显示其他需要显示的刻度值) */ class uiAxis : public QWidget { Q_OBJECT public: /** @brief 坐标轴类型 * * @details 坐标轴类型 */ enum AXISTYPE{ LEFT_AXIS = 0, TOP_AXIS, RIGHT_AXIS, BOTTOM_AXIS }; /** @brief 构造函数 */ uiAxis(AXISTYPE type = BOTTOM_AXIS, QWidget *parent = 0); /** @brief 析构函数 */ ~uiAxis(void); /** @brief 设置坐标轴的范围 */ void setScop(double minValue, double maxValue); /** @brief 获取坐标轴的范围 */ void getScop(double& minValue,double& maxValue); /** @brief 获取坐标轴的范围 */ double getMinValue(); double getMaxValue(); /** @brief 设置坐标轴的类型 */ void setAxisType(AXISTYPE type); /** @brief 坐标轴的类型 */ AXISTYPE getAxisType(); /** @brief 设置最小刻度(小刻度的最小间隔) */ void setMinInterval(double value); /** @brief 设置自动间隔 */ void setAutoScale(bool val=true); /** @brief 设置固定间隔 */ void setSettedScale(bool val=true); /** @brief 设置坐标轴的绘制范围, 像素值 */ void setBoundary(int left, int right, int top, int bottom); void getBoundary(int& left, int& right, int& top, int& bottom);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值