Как отправить искусственный QKeyEvent в QWebEngineView?

Контекст: я создаю небольшой веб-браузер с настраиваемой экранной клавиатурой.

С Qt WebKit работало почти нормально (QWeb* классы), но были ошибки, связанные с ошибками в WebKit … которые не будут исправлены после Qt 5.4.0, так как они переходят на Qt WebEngine.

Поэтому я решил перенести материал в Qt WebEngine (QWebEngine* классы), следуя краткому руководству по переходу webkit-> webengine.
После раздела предостережения на QWebElement, Я работал, показывая / скрывая экранную клавиатуру (которая теперь требует запуска асинхронного кода JS).
Но я чешу голову на как отправить события искусственного ключа на веб-страницу.

Я попробовал некоторые вещи:

  • QCoreApplication::postEvent(m_webview, event) ничего не делает, когда работал со старым QWeb материал;
  • Можно отправить ключи с помощью JavaScript, но я считаю, что это слишком грязно

Спасибо,

9

Решение

Я полагаю, что единственная возможность достичь этого сейчас — это
использовать QAction чтобы отправить событие в WebView, используя, например, что-то вроде этого:

connect( this , SIGNAL( keyPressed( int ) ) , &m_webview , SLOT( handleKey( int ) ) );

Я полагаю, что функциональность будет добавлена ​​в Qt 5.5.1, как вы можете видеть ниже:

https://codereview.qt-project.org/#/c/104901/

1

Другие решения

Несмотря на то, что первоначальному вопросу исполнился год, он все еще актуален для тех, кто, как я, решил (наконец-то!) Перейти с QWebKit на QWebEngine (Qt 5.5 — 5.6b). Вот грязное решение, которое требует существующей webenginepage-> view (). Это для событий мыши, и это не было бы большим сюрпризом, если бы оно не было расположено для событий клавиатуры:

void Whatever::sendMouseEvent( QObject* targetObj, QMouseEvent::Type type, const QPoint& pnt ) const
{
QMouseEvent event( type, pnt, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier );
QApplication::sendEvent( targetObj, &event );
}

void Whatever::sendMouseClick( QObject* targetObj, const QPoint& pnt ) const
{
sendMouseEvent( targetObj, QMouseEvent::MouseMove, pnt );
sendMouseEvent( targetObj, QMouseEvent::MouseButtonPress, pnt );
sendMouseEvent( targetObj, QMouseEvent::MouseButtonRelease, pnt );
}

void Whatever::emulateMouseClick( const QPoint& pnt ) const
{
//-- right now (Qt 5.5 & 5.6) there is only one child -
//-- QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget
//-- but it could change in future
Q_FOREACH( QObject* obj, mWebEnPage->view()->children() ) //-- ACHTUNG! Check mWebEnPage->view() in real code!
if( qobject_cast<QWidget*>( obj ) )
sendMouseClick( obj, pnt );
}

Вдохновленный
Использование QWebEngine для рендеринга изображения
а также
Как я могу получить события рисования с QtWebEngine?
и гуглить.

3

По вопросам рекламы [email protected]