2016-04-07 16 views
1

Qt QGraphicsItemのセットをループし、選択したグラフアイテム内の最大X値を見つける方法を教えてください。私は動作しているようだが、最小値をNULLに設定するのが理想的ではないことを思い出しています。私がそれをしている唯一の理由は、そうでなければ、値が非常に遠く離れた何かを返すからです。私はこれを最も効率的な方法でやっているような気がしません。実際のグラフ項目自体の幅を考慮してください。QGraphicsItemsで最大のX pos値を見つける

float max = NULL; 
    foreach (QGraphicsItem* item, items) { 
     if (!item) continue; 
     if (item->type() == NexusBlockItem::Type) { 
      float x = item->pos().x() + item->sceneBoundingRect().width()*.5; 
      if (max == NULL) max = x; 
      if (x > max) { 
       max = x; 
      } 
     } 
    } 

enter image description here

答えて

3

私は動作するようですが、私はそれがNULLに最小値を設定する 理想的ではないリコール機能を持​​っています。

浮動小数点値をNULLに設定することは実際にはできません。ポインタのみがC++ではNULLになり、floatはポインタ型ではないためです。あなたが実際に行っていることは、最大値を0.0fに初期化することです(NULLは通常0と定義されるため)。概念的には意味がありません。実際のx位置0より小さい。

限り、それをよりよく行う方法として、あなたは私が考えることができる2つのオプションがあります。

1)あなたの最大の変数はまだ初期化されていない場合に追跡するために、別々のmaximum_value_is_set変数を追加します。

float max; // not initialized here, because... 
bool maximum_value_is_set = false; // we'll keep track of it this way instead 

[...] 

float x = item->pos().x() + item->sceneBoundingRect().width()*.5; 
if ((maximum_value_is_set == false)||(x > max)) { 
    max = x; 
    maximum_value_is_set = true; 
} 

2)または、その代わりに、あなただけの可能な最小の浮動小数点値に最大のデフォルト値を設定できます

float max = -FLT_MAX; 
[...] 

...そのようには考えられるあらゆるxの値はより大きくなりますmaxの元の値。ところで

...

float x = item->pos().x() + item->sceneBoundingRect().width()*.5; 

なぜそこ* 0.5?このコードは、四角形の中心を計算するように見えますが、あなたのグラフィックによれば、右側にもっと興味があります(この場合、* .5を取り除きたいと思うでしょう)。

+0

'bool'フラグは少し残念ですが、私はこれらの厄介なCマクロを決して覚えていないので、通常は' std :: numeric_limits .max() 'で2番目のアプローチを使用します。 [cppreference](http://en.cppreference.com/w/cpp/types/numeric_limits)によると、それは 'FLOAT_MAX'ではなく' FLT_MAX'と呼ばれ、C++ 11では 'std :: '-max()'の代わりにnumeric_limits .lowest() 'を使います。 –

+0

.5の理由は、各グラフィックアイテムのアンカーポイントが境界矩形の中心に設定されているためです。だから私はそれを補う必要があり、グラフィック項目の最も遠い右端を見つける。 – JokerMartini

0

このコードはあなたが共有したアイテム用です。

float max = 0; 
     foreach (QGraphicsItem* item, items) { 
      if (!item) continue; 
      if (item->type() == NexusBlockItem::Type) { 
       float x = item->boundingRect().width(); 
       if (x > max) { 
        max = x; 
       } 
      } 

が、あなたの2番目の項目や他の人が

アイテム - > boundingRect()以外のもっと右にシフトしている場合windth();正しい値を与えていない。

"X"の最大値は何ですか?それは最大のアイテムの幅またはシーン長方形の幅ですか?

関連する問題