我开发了一个跨平台的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上崩溃。
当我将多段线更改为多边形时,程序不会崩溃。我最好的,但丑陋的解决方案是将折线绘制为多边形-将相同的点追加到多边形上两次:
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);我试图在一个小而独立的程序中重现这个bug,它在QGraphicScene上绘制一条具有相同坐标的直线。没有观察到崩溃。
为什么会发生这种崩溃?有没有更好的方法来解决这个bug呢?
顺便说一下,VS2008调试器中的调用堆栈告诉我崩溃发生在msvcr90.dll的malloc.c中,这是由QtGui4.dll调用的。
技术细节:
Qt版本: 4.7.0
操作系统: Windows 7和Ubuntu
发布于 2012-06-10 19:02:03
您是否知道还有QGraphicsPathItem?(QGraphicsPolygonItem仅适用于闭合多边形,不适用于多段线。path项用于常规路径。)
您需要从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);但请注意,由于您发布的代码似乎没有错误,因此您的程序中必须存在严重错误(可能位于代码中不同的(可能相关的)位置),您无论如何都应该修复它!
可能在坐标的生成过程中有一个bug?或者甚至在生成QPolygonF之前进行一些计算?你有没有尝试注释掉生成项目的代码?
您也可以尝试使用valgrind alternative for Windows。有关一些工具,请参阅this Stackoverflow question。
https://stackoverflow.com/questions/10967199
复制相似问题