背景信息:我正在使用自定义屏幕键盘创建小型Web浏览器。
使用Qt WebKit(QWeb*
类)工作得很好但是WebKit中的错误导致了崩溃......在Qt 5.4.0之后它们没有被修复,因为它们已经被修复了转到Qt WebEngine。
所以我决定将这些内容移到Qt WebEngine(QWebEngine*
类),遵循简短的webkit-> webengine过渡指南。
按照QWebElement
上的警告部分,我一直在显示/隐藏屏幕键盘(现在需要运行异步.JS代码)。
但是我在如何将人工关键事件发送到网页上摸不着头脑。
我尝试了一些东西:
QCoreApplication::postEvent(m_webview, event)
在处理旧QWeb
内容时没有做任何事情; 谢谢,
答案 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 image 和 How 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中添加,如下所示:
答案 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);
}