Qt程序在Windows中折线绘图时崩溃

时间:2012-06-10 08:08:59

标签: c++ windows qt cross-platform qgraphicsscene

我开发了一个跨平台的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上绘制一条具有相同坐标的线。没有观察到崩溃。

为什么会发生这种崩溃?这个错误是否有更漂亮的解决方案?

顺便说一句,VS2008调试器中的调用堆栈告诉我崩溃是在mstcr90.dll中的malloc.c中,由QtGui4.dll调用。

技术指标:

Qt版本:4.7.0

操作系统:Windows 7和Ubuntu

1 个答案:

答案 0 :(得分:2)

您知道还有QGraphicsPathItem吗? (QGraphicsPolygonItem仅适用于封闭多边形,不适用于折线。路径项适用于常规路径。)

您需要从QPainterPath

构建QPolygon
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。有关某些工具,请参阅this Stackoverflow question