2015-01-12 31 views
8

Kontekst: Tworzę małą przeglądarkę internetową z niestandardową klawiaturą ekranową.Jak wysłać sztuczny QKeyEvent do QWebEngineView?

To działało prawie dobrze z Qt WebKit (klasy QWeb*), ale zdarzały się awarie przypisywane do błędów w WebKit ... które nie zostaną naprawione po Qt 5.4.0, ponieważ przechodzą do Qt WebEngine.

Postanowiłem więc przenieść te rzeczy do Qt WebEngine (klasy QWebEngine*), korzystając z krótkiego przewodnika webkit-> webengine. Po sekcji z zastrzeżeniami na QWebElement pokazałem/ukryłem klawiaturę ekranową (która wymaga teraz asynchronicznego kodu .JS). Ale drapię się po głowie jak wysłać sztuczne wydarzenia na stronę internetową.

Próbowałem kilka rzeczy:

  • QCoreApplication::postEvent(m_webview, event) nic nie robi, kiedy pracował ze starym QWeb rzeczy;
  • Jest możliwe, aby wysłać klucze uruchamiając JavaScript, ale uważam to za brudne

Dzięki,

+1

Udało ci się to osiągnąć? – barkside

Odpowiedz

1

Chyba jedyną możliwość osiągnięcia tego teraz byłoby wykorzystują QAction aby wysłać impreza na WebView za pomocą na przykład coś takiego:

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

Przypuszczam FUNC ności zostaną dodane w Qt 5.5.1, jak widać poniżej:

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

+0

Dzięki za wskaźnik do rzeczy Qt 5.5.1. –

3

Pomimo pierwotnego pytania jest roczek, wciąż jest rzeczywista dla tych, którzy lubią mnie postanowił przenieść się z (w końcu!) QWebKit do QWebEngine (Qt 5.5 - 5.6b). Oto brudne rozwiązanie, które wymaga istniejącej strony wwwengin-> view(). To jest dla zdarzeń myszy, a to nie byłoby wielką niespodzianką, jeśli nie jest położony na imprezy klawiszowych:

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

Zainspirowany Using QWebEngine to render an image i How can I get paint events with QtWebEngine? i googling.