1

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

4

1 に答える 1

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を生成する前でも計算しますか?アイテムを生成するコードをコメントアウトしてみましたか?

Windows用のvalgrindの代替を使用することもできます。一部のツールについては、このStackoverflowの質問をご覧ください。

于 2012-06-10T11:02:02.950 に答える