Russian Qt Forum
Ноябрь 22, 2024, 18:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Что происходит с boundingRect() и как он связан с hoverEvent() ?  (Прочитано 5331 раз)
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;
}
 

Спасибо
« Последнее редактирование: Август 24, 2016, 14:35 от Hrundel » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Август 24, 2016, 14:34 »

А разве не возник вопрос типа "А нафига я вызываю QPainterPath::controlPointRect() аж 4 раза?"  Непонимающий

И чем не устроил QPainterPath::boundingRect() ?
« Последнее редактирование: Август 24, 2016, 14:37 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Hrundel
Гость
« Ответ #2 : Август 24, 2016, 14:38 »

 да это только для примера. чтобы понятно было что он возвращает. В реале то оно конечно так выглядит:

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

QPainterPath::boundingRect() тоже прекрасно устраивает, но дает тот же результат.  hoverEvent работает в неправильных границах.
« Последнее редактирование: Август 24, 2016, 14:41 от Hrundel » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Август 24, 2016, 14:42 »

Для hover-a нужно перегружать QGraphicsItem::shape():
Код
C++ (Qt)
QPainterPath Qcr::shape() const
{
      return painterPath_;
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
Hrundel
Гость
« Ответ #4 : Август 24, 2016, 14:43 »

Перегружен

Код
C++ (Qt)
QPainterPath Qcr::shape(void) const
{
return painterPath_;
}
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Август 24, 2016, 14:54 »

Почитайте в документации в каких системах координат вы должный возвращать значения. Скорее всего shape работает в системе координат итема, а boundingRect должен возвращаться в системе координат parentа.
Записан
Hrundel
Гость
« Ответ #6 : Август 24, 2016, 15:11 »

Координаты совпадают по причине того, что оба объекта находятся в нулевой позиции.  Поэтому даже при несовпадении систем координат должно бы работать, так как у них одинаковые значения.
Но даже не зависимо от этого - если я помещаю те же самые динамические знаечения вручную - то все работает, а если передаю - то не работает.
Попробовал мапить - тот же эффект.
« Последнее редактирование: Август 24, 2016, 15:19 от Hrundel » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Август 24, 2016, 16:19 »

А покажите как и где у вас формируется этот painterPath_.
Что-то в памяти у меня всплывает, что boundingRect должен быть фиксирован, а shape должна вписываться в него, а не наоборот.
Причем, изменить значение boundingRect просто так нельзя, нужно обязательно уведомить сцену, что-бы она свои кеши подтерла.
Записан
Hrundel
Гость
« Ответ #8 : Август 24, 2016, 18:24 »

А у меня наоборот. Попробую переделать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.291 секунд. Запросов: 23.