Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Hrundel от Август 24, 2016, 13:33



Название: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Hrundel от Август 24, 2016, 13:33
Всем привет,

странная проблема - когда пытаюсь создать boundingRect динамически или получить разчитаный через QPainterPath - hoverEvent работает криво. Если кодирую жестко - работает правильно.

Как я вижу перерисовка происходит в правильных границах. Но на границы hoverEvent влияет то, как опеределен boundingRect. Если boundingRect  прописан хардом, то и hoverEvent работает в правильных границах, если boundingRect  прописан динамически то hoverEvent кривой!

Вот например динамический boundingRect который не работает:

Код
C++ (Qt)
QRectF Qcr::boundingRect(void) const
{
qreal x = painterPath_.controlPointRect().x();  // возвращает -50
qreal y = painterPath_.controlPointRect().y();  // возвращает -50
qreal w = painterPath_.controlPointRect().width();  // возвращает 230
qreal h = painterPath_.controlPointRect().height();  // возвращает 230
 
QRectF r(x, y, w, h ); //  ТОГДА ГРАНИЦЫ HOVERMOVEEVENT (x = 0, y = 0, w = 50, h = 25 );    !!!!!!!!!!!!!!!!!  ПОЧЕМУ МЛИН   ????????????????????????????
return r;
}
 

Хард код делает все правильно:

Код
C++ (Qt)
QRectF Qcr::boundingRect(void) const
{
QRectF r(-200, -200, 400, 400 );
return r;
}
 

Спасибо


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: GreatSnake от Август 24, 2016, 14:34
А разве не возник вопрос типа "А нафига я вызываю QPainterPath::controlPointRect() аж 4 раза?"  ???

И чем не устроил QPainterPath::boundingRect() ?


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Hrundel от Август 24, 2016, 14:38
 да это только для примера. чтобы понятно было что он возвращает. В реале то оно конечно так выглядит:

Код
C++ (Qt)
QRectF Qcr::boundingRect(void) const
{
return painterPath_.controlPointRect();
}
 

QPainterPath::boundingRect() тоже прекрасно устраивает, но дает тот же результат.  hoverEvent работает в неправильных границах.


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: GreatSnake от Август 24, 2016, 14:42
Для hover-a нужно перегружать QGraphicsItem::shape():
Код
C++ (Qt)
QPainterPath Qcr::shape() const
{
      return painterPath_;
}
 


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Hrundel от Август 24, 2016, 14:43
Перегружен

Код
C++ (Qt)
QPainterPath Qcr::shape(void) const
{
return painterPath_;
}
 


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Old от Август 24, 2016, 14:54
Почитайте в документации в каких системах координат вы должный возвращать значения. Скорее всего shape работает в системе координат итема, а boundingRect должен возвращаться в системе координат parentа.


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Hrundel от Август 24, 2016, 15:11
Координаты совпадают по причине того, что оба объекта находятся в нулевой позиции.  Поэтому даже при несовпадении систем координат должно бы работать, так как у них одинаковые значения.
Но даже не зависимо от этого - если я помещаю те же самые динамические знаечения вручную - то все работает, а если передаю - то не работает.
Попробовал мапить - тот же эффект.


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Old от Август 24, 2016, 16:19
А покажите как и где у вас формируется этот painterPath_.
Что-то в памяти у меня всплывает, что boundingRect должен быть фиксирован, а shape должна вписываться в него, а не наоборот.
Причем, изменить значение boundingRect просто так нельзя, нужно обязательно уведомить сцену, что-бы она свои кеши подтерла.


Название: Re: Что происходит с boundingRect() и как он связан с hoverEvent() ?
Отправлено: Hrundel от Август 24, 2016, 18:24
А у меня наоборот. Попробую переделать.