如何将人工QKeyEvent发送到QWebEngineView?

时间:2015-01-12 03:10:55

标签: c++ qt qwebview qtwebengine

背景信息:我正在使用自定义屏幕键盘创建小型Web浏览器。

使用Qt WebKit(QWeb*类)工作得很好但是WebKit中的错误导致了崩溃......在Qt 5.4.0之后它们没有被修复,因为它们已经被修复了转到Qt WebEngine。

所以我决定将这些内容移到Qt WebEngine(QWebEngine*类),遵循简短的webkit-> webengine过渡指南。 按照QWebElement上的警告部分,我一直在显示/隐藏屏幕键盘(现在需要运行异步.JS代码)。 但是我在如何将人工关键事件发送到网页上摸不着头脑。

我尝试了一些东西:

  • QCoreApplication::postEvent(m_webview, event)在处理旧QWeb内容时没有做任何事情;
  • 可以通过运行JavaScript发送密钥,但我发现这太脏了

谢谢,

3 个答案:

答案 0 :(得分:4)

尽管最初的问题已经有一年了,但对于那些喜欢我的人来说,这仍然是真实的(最后!)从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 );
}

灵感来自 Using QWebEngine to render an imageHow can I get paint events with QtWebEngine? 和谷歌搜索。

答案 1 :(得分:2)

我想现在实现这一目标的唯一可能性就是 利用QAction通过使用类似的东西将事件发送到WebView:

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

我认为功能将在Qt 5.5.1中添加,如下所示:

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

答案 2 :(得分:0)

此代码可以正常工作

 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);
    }