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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как связаны hoverEnterEvent(...) и paint(...) у потомков QGraphicsItem?  (Прочитано 4208 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Апрель 09, 2010, 11:14 »

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

итак, есть класс A:QGraphicsItem, в нем заданы некие общие характеристики отображения, рисовать он сам ничего не умеет
- есть класс B:A, он умеет рисовать разные текстовые объекты (есть еще класс X:A, который тоже рисует, но другое);
- есть классы C:B и D:B, которые содержат разные тексты, и отображаются они немного по-разному;
- в классе B есть методы обработки наезда курсором, в которых устанавливается цвет фона при наезде, и меняется назад при уходе (там делается darker/lighter);
- в классе B есть такой рисователь:
Код:
void Gitext::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(widget);

    painter->setPen(color);
    painter->setBrush( QBrush(bgColor) );
    painter->setFont(font);
    painter->drawText( boundingRect(), Qt::AlignCenter, text);
}

bgColor - поле класса A, его изменяет метод обработки наезда курсором, проверено, изменяет во всех случаях:

Код:
void B::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
bgColor = bgColor.darker(130);
update();
}

void B::hoverLeaveEvent(QGraphicsSceneHoverEvent * event)
{
bgColor = bgColor.lighter(130);
update();
}

при этом классы С и D имеют почти одинаковые paint, которые выглядят примерно так:

Код:
void С/*или D*/::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(widget);

// здесь код, отличающися у классов C и D, но там только рисование линий по-разному происходит, фон не затрагивается

    B::paint(painter, option, widget);
}
в результате при наезде курсором на айтемы класса С у них фон меняется, а у айтемов класса D - почему-то нет  Непонимающий

пытаюсь ходить отладчиком - без толку, после входа в hoverLeaveEvent в paint я не попадаю, хотя вроде бы должен, попадаю в него только после отработки hoverLeaveEvent, причем это для обоих классов С и D, но в таком случае когда же у С успевает поменяться фон??!

в общем, совершенно не понятно, когда при обработке события "наезд мышью" производится перерисовка, поэтому я не могу отследить где в чужом коде меняется цвет фона (а он точно правильно устанавливается в hoverEnterEvent)

если перерисовка вызывается при update(), то не понятно, почему отладчик не останавливается в paint() при вызове update() из hoverEnterEvent() - причем не понятно, почему в обоих случаях не останавливается, хотя в одном фон меняется, в другом нет, оба айтема не перекрыты, оба видимы, то есть "задержанный paint" должен вызываться

похоже здесь какой-то подводный камень, хелп, в общем...

АААА!!!!... Блин.... в дополнение к изменению фона сделал изменение шрифта - шрифт меняется, а фон нет! вот же засада!  Злой
« Последнее редактирование: Апрель 09, 2010, 11:57 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Апрель 09, 2010, 13:25 »

вот же ексель моксель... сделал отладочную трассировку - в paint() для обоих классов все правильно вызывается,     painter->setBrush( QBrush(bgColor) ); меняет цвет фона как надо... но почему-то у одного класса это отображается, а у другого нет

HELP!!!
Записан

2^7-1 == 127, задумайтесь...
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Апрель 09, 2010, 14:25 »

Может я чего не разглядел, но я не вижу чем вы заливаете фон элемента - не вижу вызова метода QPainter-a (drawRect(), drawPolygon() ...).
По умолчанию все элементы сцены прозрачные.
Записан

Qt 5.11/4.8.7 (X11/Win)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Апрель 09, 2010, 14:43 »

фуууфффф... это я уже перегрелся.... хорошо хоть пятница сегодня...
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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