我开发了一个跨平台的 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);
我试图在一个小型且独立的程序中重新创建该错误,该程序在 QGraphicScene 上绘制一条具有相同坐标的线。没有观察到崩溃。
为什么会发生这种崩溃?这个错误有更漂亮的解决方案吗?
顺便说一句,VS2008 调试器中的调用堆栈告诉我崩溃是在由 QtGui4.dll 调用的 msvcr90.dll 中的 malloc.c 中。
技术:
Qt版本:4.7.0
操作系统:Windows 7 和 Ubuntu