2015-01-12 9 views
8

コンテキスト:私はカスタムオンスクリーンキーボードを備えた小さなWebブラウザを作成しています。人工QKeyEventをQWebEngineViewに送信する方法は?

Qt WebKit(QWeb*クラス)でほぼ正常に動作しましたが、WebKitのバグに起因するクラッシュが発生しました... Qt 5.4.0以降はQt WebEngineに移行しているため修正されません。

私は短いwebkit-> webengine移行ガイドの後に、Qt WebEngine(QWebEngine*クラス)に移動することにしました。 QWebElementの警告セクションに続いて、オンスクリーンキーボードを表示/非表示にしています(非同期のJSコードを実行する必要があります)。 しかし私はの上で私の頭を傷つけています。人工的なキーイベントをウェブページに送る方法。

私はいくつかのものを試してみました:それは古いQWebもので働いていたとき

  • QCoreApplication::postEvent(m_webview, event)は、何もしません。
  • それは、JavaScriptを実行することで、キーを送信することが可能ですが、私はこのあまりにも汚い

おかげで、

+1

これでどこにでも行くことができましたか? – barkside

答えて

1

私は今、この権利を達成するための唯一の可能性を送信するためにQActionの メイク用いることであろう推測を見つけます例えばそのような何か使用してのWebViewのイベント:

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

を私はFUNCを想定あなたは以下を参照することができますようtionalityはQtの5.5.1で追加されます。

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

+0

Qt 5.5.1へのポインタありがとう。 –

3

元の質問にもかかわらず、それはまだ私のように移動することを決めた人のための実際のある、1歳ですから(最後に!) QWebKitからQWebEngineへ(Qt 5.5 - 5.6b)。ここに、既存のwebenginepage-> view()を必要とする汚い解決策があります。これは、マウスイベントのためであり、それはキーボードイベントのために位置していない場合、それは大きな驚きではないでしょう。

Using QWebEngine to render an imageHow can I get paint events with QtWebEngine? とグーグルに触発
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); 
} 

関連する問題