Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Гурман от Апрель 09, 2010, 11:14



Название: как связаны hoverEnterEvent(...) и paint(...) у потомков QGraphicsItem?
Отправлено: Гурман от Апрель 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" должен вызываться

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

АААА!!!!... Блин.... в дополнение к изменению фона сделал изменение шрифта - шрифт меняется, а фон нет! вот же засада!  >:(


Название: Re: как связаны hoverEnterEvent(...) и paint(...) у потомков QGraphicsItem?
Отправлено: Гурман от Апрель 09, 2010, 13:25
вот же ексель моксель... сделал отладочную трассировку - в paint() для обоих классов все правильно вызывается,     painter->setBrush( QBrush(bgColor) ); меняет цвет фона как надо... но почему-то у одного класса это отображается, а у другого нет

HELP!!!


Название: Re: как связаны hoverEnterEvent(...) и paint(...) у потомков QGraphicsItem?
Отправлено: GreatSnake от Апрель 09, 2010, 14:25
Может я чего не разглядел, но я не вижу чем вы заливаете фон элемента - не вижу вызова метода QPainter-a (drawRect(), drawPolygon() ...).
По умолчанию все элементы сцены прозрачные.


Название: Re: как связаны hoverEnterEvent(...) и paint(...) у потомков QGraphicsItem?
Отправлено: Гурман от Апрель 09, 2010, 14:43
фуууфффф... это я уже перегрелся.... хорошо хоть пятница сегодня...