Версия для печати темы
Форум на CrossPlatform.RU _ Qt Script. Интеграция WebKit _ Web AxWidget
Автор: Саша 24.1.2008, 20:45
Проблеммы встроить WebBrowser в Qt-приложение не составляет. НО получившийся браузер НЕ ВСЕ клавиши пускает, например, до JScript-ов. В частности не пускает стрелочки, Backspace, PgUp, PgDown. В чём несложно убедиться написав такой HTML-код:
CODE
<script>
function on_keydown( e )
{
var keyChar = String.fromCharCode(event.which);
window.status = event.keyCode;
document.all["StatusLine"].innerText = event.keyCode;
}
document.onkeydown = on_keydown;
</SCRIPT>
<BODY>
ppppppppp
</BODY>
<P ID=StatusLine>
aaaaa
</P>
и сравнив результаты его работы в обычном IExplorer-е или (другом браузере) и браузере написаном на Qt.
После нескольких дней поиска была найдена виртуальная ф-я класса QAxWidget::translateKeyEvent. Если снаследовать этот класс и переопределив эту ф-ю возвращать в ней всегда true, все клавиши начинают доходить, НО теперь все те проблемные клавиши начинают приходить дважды, например, в полях ввода. что несложно проверить на следующем HTML-коде:
CODE
<HTML>
<BODY>
<INPUT TYPE=TEXT></INPUT>
</BODY>
</HTML>
Чтобы увидеть нехороший эффект нужно ввести в поле редактирования буквы, а потом поперемещать в нём текстовый курсор при помощи клавиш "вправо", "влево". Курсор будет смещаться сразу на 2 символа.
В Интернете я после всего этого наткнулся на страницу
http://www.crossplatform.ru/documentation/qtdoc4.3/activeqt-webbrowser-webaxwidget-h.php.
Там тоже переопределяется ф-я QAxWidget::translateKeyEvent. Но как было отмечено появляется дублирование клавишь.
Что делать???!!!
Автор: ViGOur 24.1.2008, 20:52
А как ты переопределил функцию translateKeyEvent? Так же как в примере или по своему?
Автор: ViGOur 24.1.2008, 21:45
А вот и ответ у тролей:
Цитата
Some key events happen twice with ActiveX controls hosted by QAxWidget, this does not happen for all key presses, but usually happens with accelerators.
-----
This behavior is as per design, best way to avoid this in your control is to re-implement the translateKeyEvent of QAxWidget & return false. The default QAxWidget implementation returns true in this scenario, which inturn sends the message directly to the control's window procedure. This is required for common servers like Internet Explorer and Microsoft Office.
http://trolltech.com/developer/task-tracker/index_html?method=entry&id=110079
В общих словах, как я понял, в translateKeyEvent нужно возвращать не true, а false.
Автор: Саша 25.1.2008, 11:19
Вначале я переопределил по-своему: просто "return true". потом попробовал как в примере. Результат то-же - двойное нажатие. Если возвращать всегда false - то не доходят вообще никакие клавиши. Ещё один интересный факт: ф-я translateKeyEvent вызывается 1 РАЗ! А нажатий оказывается 2. Даже хуки не показывают 2-ное нажатие и MSVisual-овский Spy.
Автор: ViGOur 25.1.2008, 11:26
А если попробовать так:
virtual bool translateKeyEvent(int message, int keycode) const
{
if (message >= WM_KEYFIRST && message <= WM_KEYLAST)
return false;
else
return QAxWidget::translateKeyEvent(message, keycode);
}
Как я понимаю идет речь о закрытии событий для кнопок: лево, право, вверх, вних и бекспэйс.
Просто как написано в описании: http://www.crossplatform.ru/documentation/qtdoc4.3/qaxwidget.php#translateKeyEvent
Цитата
If the function returns false the processing of the key event is ignored by ActiveQt, ie. the ActiveX control might handle it or not.
Автор: Саша 25.1.2008, 11:32
ViGOur, залез я по твоей ссылке к тролям...
Как я понял, они этот баг вначале хотели исправить в 4-ой версии, а потом всё-таки отвергли (2007-12-06 17:25 - Resolution set to 'Rejected'). И сказали, что нужно возвращать false. Но я ж говорю, что тогда не доходят сообщения до скриптов. Может им снова баг написать? Я только пока не знаю как.
Автор: Саша 25.1.2008, 11:36
Цитата(ViGOur @ 25.1.2008, 11:26)
А если попробовать так:
virtual bool translateKeyEvent(int message, int keycode) const
{
if (message >= WM_KEYFIRST && message <= WM_KEYLAST)
return false;
else
return QAxWidget::translateKeyEvent(message, keycode);
}
Как я понимаю идет речь о закрытии событий для кнопок: лево, право, вверх, вних и бекспэйс.
Просто как написано в описании: http://www.crossplatform.ru/documentation/qtdoc4.3/qaxwidget.php#translateKeyEvent
Цитата
If the function returns false the processing of the key event is ignored by ActiveQt, ie. the ActiveX control might handle it or not.
Попробовал. Теперь до скриптов не доходят клавиши. Я ж говорю. Проблема сводится к поговорке. "Нос вытянул - ножка увязла, ножку вытянул - нос увяз".
Автор: ViGOur 25.1.2008, 11:37
Раз отвергли, то нужно сначала попробовать самому обойти эту проблему, тебе же нужно использовать сейчас этот функционал, а не ждать пока они исправят.
Попробуй вариации: (message == WM_KEYFIRST && message == WM_KEYLAST)
У меня к сожалению нет готового проекта с WebBrowser, а то сам попробовал бы.
Автор: Саша 25.1.2008, 11:50
Цитата(ViGOur @ 25.1.2008, 11:37)
Раз отвергли, то нужно сначала попробовать самому обойти эту проблему, тебе же нужно использовать сейчас этот функционал, а не ждать пока они исправят.
Покажи как ты переопределяешь translateKeyEvent, что у тебя ни одно событие нажатия клавиш не доходит.
Значит так чтоб не доходили клавиши я пишу так:
CODE
bool CQWebBrowser::translateKeyEvent ( int message, int keycode ) const
{
return false;
}
НО клавиши не доходят ТОЛЬКО до скриптов
Автор: Саша 25.1.2008, 11:54
Цитата(ViGOur @ 25.1.2008, 11:37)
У меня к сожалению нет готового проекта с WebBrowser, а то сам попробовал бы.
Для версии Qt 3.3.4 могу щас побыстрому попробовать собрать проект
Автор: ViGOur 25.1.2008, 11:56
Стоп, а тебе нужно, чтобы кнопки-стрелочки и бекспэйс доходили до твоего javascript или нет?
Автор: ViGOur 25.1.2008, 11:57
Цитата(Guest_Саша_* @ 25.1.2008, 11:54)
Для версии Qt 3.3.4 могу щас побыстрому попробовать собрать проект
У меня сейчас только 4.3.2, хотя могу попробовать переключиться на поддержку Qt3.
Автор: Саша 25.1.2008, 12:00
Цитата(ViGOur @ 25.1.2008, 11:56)
Стоп, а тебе нужно, чтобы кнопки-стрелочки и бекспэйс доходили до твоего javascript или нет?
В том-то и дело, что нужно
Автор: ViGOur 25.1.2008, 12:05
Тогда оформлять как баг, или попробовать заморочиться с исправлением самим
Автор: Саша 25.1.2008, 12:08
Цитата(ViGOur @ 25.1.2008, 12:05)
Тогда оформлять как баг, или попробовать заморочиться с исправлением самим
Вот я и не знаю что делать. Наверное нужно и то и другое. Но с Qt я только начинаю разбираться. А тут в потроха его лезть надо.
Автор: ViGOur 25.1.2008, 12:13
угу, нужно лезть, заодно и получше изучишь Qt изнутри.
А если что-то не понятно будет, то для того и существует форум...
Автор: Alexandr 27.1.2008, 12:51
Я бы использовал ,на вашем месте, модуль QtWebKit. ActiveX - это проприетарные костыли и поддерживаются они тролльтехами только из-за широкого распостранения и отсутствия своего(и они это положение исправляют).
Вот моя заметка на эту тему http://qt-rus.wikidot.com/simplewebbrowser.
Qt 4.4 выйдет через месяц, а пока можно использовать вполне рабочую http://trolltech.com/developer/downloads/qt/qt44-preview-download
Успехов!
Автор: klochec_v 21.2.2008, 14:16
еще такой вопрос у когонить была такая проблема что при перезагрузке браузера(или другой причине) пропадал курсор(приглашение ввода) в поле ввода текста. нажимая текстовые клавиши на клавиатур они появляются в поле ввода однако никакие другие клавиши не работают получается курсора нет а фокус как бы есть...
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)