QGraphicsSceneにポリラインをプロットするクロスプラットフォームQtプログラムを開発します。
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ではクラッシュしません。
ポリラインをポリゴンに変更しても、プログラムはクラッシュしません。私の最善の、しかし醜い解決策は、ポリラインをポリゴンとして描画することでした-同じポイントをポリゴンに2回追加します:
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
OS:Windows7およびUbuntu