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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: абстрактный виджет, управляемый через картинку себя. не передаются события детям  (Прочитано 3472 раз)
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 конструкторе
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентября 21, 2011, 06:35 »

Посмотри на это.
Записан

Qt 5.11/4.8.7 (X11/Win)
alexman
Гость
« Ответ #2 : Сентября 21, 2011, 10:16 »

ieroglif, если будешь пробовать вариант GreatSnake, отпишись. Тоже интересно Улыбающийся
Записан
ieroglif
Гость
« Ответ #3 : Октября 05, 2011, 04:36 »

продолжу тему...
что бы получить текстуру виджета - таки закидываю его на QGraphicsScene.
виджет включается, и рендерится нормально.
у меня в виджете кнопка, для которой установлены разные по цвету цсс на hover состояния. что бы увидеть что событие mouseMove передаётся правильно, нормально. вот фик =)
не могу я передать ему собственноручно сгенерированные евенты для мыши и клавиатуры.
делаю postEvent для виджета, для сцены, уже запихал сцену во вью и делаю евент ему - всё пофик.
нет реакции на hover..
куда копать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Октября 05, 2011, 11:49 »

а зачем через postEvent()? шли через sendEvent().
Записан

Qt 5.11/4.8.7 (X11/Win)
ieroglif
Гость
« Ответ #5 : Октября 05, 2011, 15:58 »

а зачем через postEvent()? шли через sendEvent().
не заработало.
какие ещё варианты?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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