我开发了一个跨平台的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问题的一些工具。