Как указано выше, состояние a! = a не будет работать в g ++ и некоторых других компиляторах, но этот трюк должен. Это может быть не так эффективно, но это все равно:
bool IsNan(float a)
{
char s[4];
sprintf(s, "%.3f", a);
if (s[0]=='n') return true;
else return false;
}
В основном, в g ++ (я не уверен в других), printf выводит «nan» на% d или% .f форматы, если variable не является допустимым целым числом / float. Поэтому этот код проверяет, чтобы первый символ строки был «n» (как в «nan»)
Я думаю, что это ожидаемое поведение. Если вы хотите ограничить размеры резиновой ленты, просто закрепите их в mouseMoveEvent
переопределении ...
void frame_displayer::mouseMoveEvent(QMouseEvent *event)
{
if(_rubberBand != nullptr)
{
if (this->underMouse())
{
if (_lastClickedBtn == Qt::LeftButton)
{
QPoint mouseCurrentPoint = event->pos();
/*
* Clamp mouseCurrentPoint to the QRect of this widget.
*/
auto clamp_rect = rect();
mouseCurrentPoint.rx() = std::min(clamp_rect.right(), std::max(clamp_rect.left(), mouseCurrentPoint.x()));
mouseCurrentPoint.ry() = std::min(clamp_rect.bottom(), std::max(clamp_rect.top(), mouseCurrentPoint.y()));
_rubberBand->setGeometry(QRect(_mouseOriginClickPoint, mouseCurrentPoint).normalized());
}
}
}
}