Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ setFocus() grabKeyboard() фокус, мигающий курсор

Автор: kwisp 30.1.2009, 13:11

народ если кто сталкивался.
программа - это виджет на весь экран на нем менеджер размещения один из элементов браузер QtWebKit.
программа стартует предлагая ввести логин и пароль в диалоговое окно после удачного логина диалог скрывается и стартует загрузка странички в браузере, страничка содержит в себя поля ввода на них фокус автоматически не устанавливается(важно). после загрузки странички на страничке фокус есть и по табуляции он переходит от элемента странички к элементу, проблема в том что не отображается мигающая полосочка показывающая куда будет вводиться следующий символ. хотя сами символы благополучно попадают в поле ввода.:( полосочка появляется если сменить фокус вручную. т.е. нажать к примеру альтаб а потом вернуться обратно и полосочка мигает.... странность однако.

Автор: ViGOur 30.1.2009, 14:33

Такое ощущение, что в данном случае проблемы с отрисовкой.

Автор: kwisp 30.1.2009, 14:43

ViGOur, я проверял даже после загрузки браузера посылал ему с помощью sendEvent() QShowEvent и результат тотже. я считаю что эта штука присутствует в qt в связи с тем что возможно события клавиотуры принимает браузер а фокус ввода на каком либо другом виджете. проблему естественно я уже решил() желаемая мигающая полоска появляется(я управляю фокусом в браузере из программы с помощью яваскрипта на страничке который устанавливает фокус куда мне нужно). однако все же интересно куда она девается при первой загрузке ???....

Автор: kwisp 5.2.2009, 18:42

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

Цитата
if focus has never been in this window before and you know where focus should start out, call QWidget::setFocus() on the widget which should receive focus before you call QWidget::show() it. If you don't, Qt will pick a suitable widget.


setFocus() по ходу получается что устанавливает фокус на виджет при следующем его показе.!!! а не сразу

добился того чтобы в поле ввода странички браузера появилась каретка(текстовый курсор ввода)
тем что в обработчике сигнала браузера loadFinished(bool)
вызвал один за другим два метода
this->setFocus();
this->show();

достаточно сделать при первой загрузке браузера и каретка станет появляться.
вообще для себя понял что фокус одна из самых скользких тем в Qt. почему то всегда с ней проблемы и неясности.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)