[Qt-users:388] Re: 矩形の重なり判定

Shingo Ishida hermit4loop @ gmail.com
2014年 12月 16日 (火) 01:54:57 JST


忘年会続きで体調不良のhermit4です。途中まで調べて、おつきあいが忙しく
なって、亀レスになってしまいました。

QRect/QRectFにおいて、高さあるいは幅が0の場合はinvalidな扱いですので、
どうなるのが正しいのかは悩ましい所です。QRectとQRectFの結果が不一
致なのは違和感があるというのはその通りですけど。

ドキュメントではQRectとQRectFで、Emptyに対する説明が異なっています。

QRectF::isEmpty() function returns true if the rectangle's width or height is
less than, or equal to, 0.

QRect::isEmpty() function returns true if left() > right() or top() > bottom().

この通りに実装されるとしたら、QRectFの場合は、高さあるいは幅が0の
場合はEmpty で、QRectの場合は、0の場合でもemptyは成立しないように
も感じて、これが理由かなとも思ったのですが・・・。

qDebug() << "QRect is empty  : " << QRect(10,10,10,0).isEmpty();
qDebug() << "QRect is valid  : " << QRect(10,10,10,0).isValid();
qDebug() << "QRectF is empty : " << QRectF(10,10,10,0).isEmpty();
qDebug() << "QRectF is valid : " << QRectF(10,10,10,0).isValid();


QRect is empty  :  true
QRect is valid  :  false
QRectF is empty :  true
QRectF is valid :  false

ということで、想像と違っていました・・・。

おそらく、当初は、QRectFをQRectにアラインした場合に、オリジナルの
QRectF時の結果と返還後のQRectで結果が異なるケースを恐れての差分が
あったのかとも思うのですが、ともあれソースコードを読むと、double
(qreal)が==演算子で比較されていたり、話題にもなっているempty rectと
書くべきコメントがnull rectとしてコメントされていたりと、適当に書い
たバグ込みのコードの臭いがぷんぷんしています。

本件は、過去にバグレポートもされていたようですが、実際、この手の
ものは直すと多くのアプリケーションを壊す可能性があり変更できない
という理由でCloseされているようです。

https://bugreports.qt-project.org/browse/QTBUG-18719

whether zero sized rect should be considered being inside other rects is a
question with many right answers
However either way we cannot change the behavior as it will most likely
break a lot of application.

鈴木さんによると、「最近の傾向だと、直せないなら代替メソッドを作っ
て緩やかにそっちに移行していくように仕向ける感じ?」との事なので、
再度reopenして、対処を提案したとしても、直るまでにはしばらく時間
がかかりそうな気がします。


Qt-users メーリングリストの案内