Qt程序在Windows中的多段线绘图上崩溃

我开发了一个跨平台的Qt程序,在QGraphicsScene中绘制了一条折线:

QPolygonF polygon; //Init polygon here for(int i = 0; i < (polygon.size()-1); i++) { float x1 = polygon[i].x(); float y1 = polygon[i].y(); float x2 = polygon[i+1].x(); float y2 = polygon[i+1].y(); QGraphicsLineItem* item = new QGraphicsLineItem(x2, y2, x1, y1); item->setPen(QPen(QBrush(color), 2)); item->setZValue(30); item->setData(0, QVariant((int)value)); addItem(item); } 

当它收到以下值时,该程序在Windows上崩溃:

  float x1 = 249.573; float y1 = 183.471; float x2 = 303.983; float y2 = 183.45; 

这条折线由几乎水平的线组成。 当水平线或y1和y2之间的绝对差值为0或大于0.5时,碰撞不会发生。 它不会在Ubuntu上崩溃。

当我将多段线更改为多边形时,程序不会崩溃。 我最好的,但丑陋的解决scheme是绘制多边形作为多边形 – 两次相同的点附加到多边形:

 QPolygonF polygon; //Init polygon here for(int i = polygon.size()-1; i > 0; i--) { QPointF point(polygon[i].x(), polygon[i].y()); polygon.append(point); } QGraphicsPolygonItem* item = new QGraphicsPolygonItem(polygon); item->setPen(QPen(QBrush(color), 2)); item->setZValue(30); item->setData(0, QVariant((int)value)); addItem(item); 

我试图在一个小而独立的程序中重新创build这个bug,在QGraphicScene上绘制一条具有相同坐标的线。 没有观察到碰撞。

为什么这个崩溃发生? 这个bug有没有更漂亮的解决scheme?

顺便说一下,VS2008debugging器中的调用堆栈告诉我,崩溃是在由QtGui4.dll调用的msvcr90.dll中的malloc.c中。

技术指标:

Qt版本:4.7.0

操作系统:Windows 7和Ubuntu

你知道还有QGraphicsPathItem吗? ( QGraphicsPolygonItem仅适用于封闭多边形,不适用于多义线,路径项适用于一般路径 。)

你需要从你的QPolygon构建一个QPainterPath

 QPainterPath path; if(polygon.size() > 0) // check this, because we use [0] outside the loop! { path.moveTo(polygon[0]); for(int i = 1; i < polygon.size(); ++i) // starting from 1 (0 was a "moveTo") path.lineTo(polygon[i]); } 

然后制作并使用路径项目:

 QGraphicsPathItem* item = new QGraphicsPathItem(path); // your additional code from above: item->setPen(QPen(QBrush(color), 2)); item->setZValue(30); item->setData(0, QVariant((int)value)); addItem(item); 

但请注意,由于您的发布代码似乎没有错误,所以在您的程序中必须存在一个严重的错误 (可能在代码中的不同(可能是相关的)位置),无论如何您应该修复这个错误!

在坐标的生成中可能有一个错误? 或者甚至在生成QPolygonF之前进行一些计算? 你有没有尝试评论产生该项目的代码?

你也可以尝试使用valgrind替代Windows。 看到这个Stackoverflow问题的一些工具。