Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ieroglif от Сентября 21, 2011, 04:09



Название: абстрактный виджет, управляемый через картинку себя. не передаются события детям
Отправлено: ieroglif от Сентября 21, 2011, 04:09
Хочу как-то просто и удобно использовать Qt виджеты в 3д графике.
Для этого решил отрисовывать виджет в картинку (прекрасно решается через QWidget::render()), эту картинку натягивать как текстуру на плоскость в 3д пространстве.
Что бы это было удобно, решил написать свой абстрактный класс виджета, от которого уже наследовать необходимый мне (что бы нужный виджет можно было легко сделать в QtDesigner, запрограммировать и проверить его поведение, и простым наследованием пустить его в 3д)
Однако, прежде чем приступать к 3д, начинаю с 2д - т.е. "картинку виджета" рисую на другом QWidget через его paintEvent() метод.
Виджет отлично рисуется.
Вопросы "трассировки" координат пока свёл к минимуму - рисую виджет в 0:0 точке. В последствии, конечно, это будет дописываться отдельно, однако для текущего момента - достаточно. виджет рисуется точно там же, где находился бы если был бы "реальным".
Запрограммированные действия тоже работают хорошо (для примера запускаю таймер, который раз в 10 мсек меняет какие-то "визуально заметные" значения у каких-то виджетов).
проблема начинается при "проксировании" событий (типа mouseMoveEvent(), mousePressEvent() и др. )
виджет принимает события (я их отлавливаю в дебаге), но отказывается их передавать дальше детям (к примеру, от клика по кнопке на виджете (по картинке, разумеется) кнопка не получается события click и, соответственно, никак не реагирует )
по ходу копания обнаружилось, что это происходит из-за того, что виджет не показан (isHidden() == true).
попробывал сделать ему show() - он появился соседним окном и, разумеется, все действия производимые с реальным виджетом сразу отображались на его отрисовываемой картинке.
События через картинку так и не стали проксироваться даже при показываемом виджете.

вопрос: куда копать, что бы держать виджет спрятаным в памяти, и полностью управлять им через проксируемые события?

в приложении - мой текущий "тестовый" проект, если кто-то захочет ковырнуться.
комманда show(), показывающая виджет, располагается в AbstracrtTextureWidget конструкторе


Название: Re: абстрактный виджет, управляемый через картинку себя. не передаются события детям
Отправлено: GreatSnake от Сентября 21, 2011, 06:35
Посмотри на это (http://www.prog.org.ru/index.php?topic=19458.msg131442#msg131442).


Название: Re: абстрактный виджет, управляемый через картинку себя. не передаются события детям
Отправлено: alexman от Сентября 21, 2011, 10:16
ieroglif, если будешь пробовать вариант GreatSnake, отпишись. Тоже интересно :)


Название: Re: абстрактный виджет, управляемый через картинку себя. не передаются события детям
Отправлено: ieroglif от Октября 05, 2011, 04:36
продолжу тему...
что бы получить текстуру виджета - таки закидываю его на QGraphicsScene.
виджет включается, и рендерится нормально.
у меня в виджете кнопка, для которой установлены разные по цвету цсс на hover состояния. что бы увидеть что событие mouseMove передаётся правильно, нормально. вот фик =)
не могу я передать ему собственноручно сгенерированные евенты для мыши и клавиатуры.
делаю postEvent для виджета, для сцены, уже запихал сцену во вью и делаю евент ему - всё пофик.
нет реакции на hover..
куда копать?


Название: Re: абстрактный виджет, управляемый через картинку себя. не передаются события детям
Отправлено: GreatSnake от Октября 05, 2011, 11:49
а зачем через postEvent()? шли через sendEvent().


Название: Re: абстрактный виджет, управляемый через картинку себя. не передаются события детям
Отправлено: ieroglif от Октября 05, 2011, 15:58
а зачем через postEvent()? шли через sendEvent().
не заработало.
какие ещё варианты?