я уже голову сломал... надо переделать чужой код, вроде не сложный, сделал как должно быть, но не работает, а где смотреть - уже глаза замылились, не вижу проблему, может кто подскажет
итак, есть класс 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" должен вызываться
похоже здесь какой-то подводный камень, хелп, в общем...
АААА!!!!... Блин.... в дополнение к изменению фона сделал изменение шрифта - шрифт меняется, а фон нет! вот же засада!