Как отправить искусственный 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, но я считаю это слишком грязным

Спасибо,


person cJ Zougloub    schedule 12.01.2015    source источник
comment
Удалось ли вам добиться чего-либо с этим?   -  person barkside    schedule 08.01.2016


Ответы (3)


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

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

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

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

person deW1    schedule 14.04.2015

Несмотря на то, что исходному вопросу уже год, он по-прежнему актуален для тех, кто, как и я, решил (наконец-то!) перейти с 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? и погуглить.

person sendevent    schedule 22.01.2016

Этот код работает нормально

 for(auto* child : ui->webEngineView->children() ) {
        int key = Qt::Key_V; //or some other
        QKeyEvent pressEvent = QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, QKeySequence(key).toString());
        QKeyEvent releaseEvent = QKeyEvent(QEvent::KeyRelease, key, Qt::NoModifier);
        qApp->sendEvent(child, &pressEvent);
        qApp->sendEvent(child, &releaseEvent);
    }
person magrif    schedule 20.04.2019