我是靠谱客的博主 阔达篮球,这篇文章主要介绍Qt Qt 绘制折线图 计算线段交点Qt 绘制折线图,现在分享给大家,希望可以做个参考。


Qt 绘制折线图

先看一张图片工程文件见下方链接

本程序的开发环境:

(1)qt4.8.6
(2)vs2010
(3)windows操作系统

本程序实现了一下功能:

(1)实时画鼠标线
(2)画折线图
(3)实时求鼠标线与折线得交点,并显示在窗口

本程序用到得方法:

(1)从写QGriphicsItem,(坐标轴部分和鼠标线和折线焦点得小圆点部分)

复制代码
1
首先继承QGraphicsItem类,从写这两个方法
复制代码
1
2
virtual QRectF boundingRect() const ; virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) ;
复制代码
1
在这里要注意的是item的坐标,坐标轴的方向和Qt定义的屏幕坐标轴的方向一样,及从屏幕左上角开始,向下是y轴的正半轴,向右是x轴的正半轴
复制代码
1
还有其中BoundingRect函数返回的矩形可以用在碰撞检测中,不再本文讨论的范畴
复制代码
1
在paint方法中,可以重新绘制你想要的item的形状,比如在本文中绘制的坐标轴item。其代码实现如下
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
复制代码
void AxisItem::DrawYAxis( QPainter *painter )
{
//y轴
painter->drawLine(_boundingRect.width(),0,_boundingRect.width(),_boundingRect.height());
if (_data._isArrow)
{
painter->drawLine(5,0,0,5);
painter->drawLine(5,0,10,5);
}
int space = _boundingRect.height()/_data._space;
//每格所占的高度
int increment = (_data._maxVal - _data._minVal)/ _data._space;
//刻度和文字
if (_data._isCenter)
{
space = _boundingRect.height()/2/_data._space;
//每格所占的高度
increment = (_data._maxVal - _data._minVal)/ _data._space;
for (int i = 1; i <= _data._space; i++)
{
painter->drawLine(0,i * space,_boundingRect.width(),i *space); //从上往下画的
QString text = QString::number((_data._space - i)*increment + _data._minVal);
QFontMetrics fontMetrics(painter->font());
painter->drawText(QRectF(-fontMetrics.width(text) - 5,space * i - 5,fontMetrics.width(text),fontMetrics.height()),text);
}
for (int i = _data._space; i <= 2*_data._space; i++)
{
painter->drawLine(0,i * space,_boundingRect.width(),i *space); //从上往下画的
QString text = QString::number((_data._space - i)*increment + _data._minVal);
QFontMetrics fontMetrics(painter->font());
painter->drawText(QRectF(-fontMetrics.width(text) - 5,space * i - 5,fontMetrics.width(text),fontMetrics.height()),text);
}
}
else
{
for (int i = 1; i <= _data._space; i++)
{
painter->drawLine(0,i * space,_boundingRect.width(),i *space);
QString text = QString::number((_data._space - i)*increment + _data._minVal);
QFontMetrics fontMetrics(painter->font());
painter->drawText(QRectF(-fontMetrics.width(text) - 5,space * i - 5,fontMetrics.width(text),fontMetrics.height()),text);
}
}
QPen pen(QColor(_data._titleColor));
painter->setPen(pen);
QString text = _data._title;
QFontMetrics fontMetrics(painter->font());
painter->drawText(QRectF(-fontMetrics.width(text)/2,-fontMetrics.height(),fontMetrics.width(text),fontMetrics.height()),text);
}
复制代码
1
在这里需要注意的是所有的坐标都是相对与看刚开始定义的boundingRect函数返回的区域,一般将区域的中心 定义为0,0点。
复制代码
1
x轴的实现同理,不在重复

(2)qt判断两条相交线的交点的方法

复制代码
1
判断两条线相交的交点,大家可以看一下QLine类,其中有一个叫做Intersect的方法可以判断两天线段的交点,我的检测代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
复制代码
for(int i = 0 ; i < polygonPos.size(); i++)
{
if (i > 0)
{
tline.setLine(polygonPos[i-1].x(),polygonPos[i-1].y(),polygonPos[i].x(),polygonPos[i].y());
QLineF::IntersectType itpye = tline.intersect(mouseLine,&interPos);
if (QLineF::IntersectType::BoundedIntersection == itpye )
{
/*添加相交后的代码
}
}
}

(3)鼠标移动事件的实现

复制代码
1
这里的鼠标移动事件,我重写了QGraphicsScene的鼠标移动事件,之所以选这类的事件,是因为对其上的Item做操作是,不需要在对鼠标的坐标进行转换,
复制代码
1
可以方法的获取鼠标在Scene上的位子坐标,得到位置坐标的方法与普通的鼠标事件相似
复制代码
1
2
3
4
5
6
7
复制代码
void MyScene::mouseMoveEvent( QGraphicsSceneMouseEvent *event )
{
 _mousePos = event->scenePos();
}

(4)qt字体的宽度和高度的计算

复制代码
1
字体高度的技术俺计算用到了QFontMetrics类,该类中有方法可以算出字体的宽度和高度,可以防止在绘图的时候放生字体绘出item的区域而看不到的问题
复制代码
1

本工程的下载地址点击打开链接


最后

以上就是阔达篮球最近收集整理的关于Qt Qt 绘制折线图 计算线段交点Qt 绘制折线图的全部内容,更多相关Qt内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部