2015-01-12 12 views
8

Contesto: sto creando un piccolo browser Web con una tastiera su schermo personalizzata.Come inviare QKeyEvent artificiale a QWebEngineView?

Stava funzionando quasi bene con Qt WebKit (QWeb* classi) ma ci sono stati arresti anomali attribuiti a bug in WebKit ... che non verranno risolti dopo Qt 5.4.0 poiché si stanno spostando su Qt WebEngine.

Così ho deciso di spostare le cose su Qt WebEngine (QWebEngine* classi), seguendo la guida webkit breve-> transizione web. Seguendo la sezione caveat su QWebElement, ho lavorato per mostrare/nascondere la tastiera su schermo (che ora richiede l'esecuzione async. Codice JS). Ma sto grattando la testa su come inviare eventi chiave artificiali alla pagina web.

Ho provato quanto alcune cose:

  • QCoreApplication::postEvent(m_webview, event) non fa nulla, quando stava lavorando con il vecchio QWeb roba;
  • E 'possibile inviare le chiavi per l'esecuzione di JavaScript, ma trovo questo troppo sporchi

Grazie,

+1

Sei riuscito ad arrivare ovunque con questo? – barkside

risposta

1

Credo che l'unica possibilità per raggiungere questo obiettivo in questo momento sarebbe quello di fanno uso di QAction di inviare un evento al WebView utilizzando per esempio qualcosa di simile:

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

suppongo che il func nalità sarà aggiunto in Qt 5.5.1, come potete vedere qui sotto:

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

+0

Grazie per il puntatore alla cosa di Qt 5.5.1. –

3

Nonostante domanda iniziale è un anno di età, è ancora reale per chi come me ha deciso di passare da (finalmente!) Da QWebKit a QWebEngine (Qt 5.5 - 5.6b). Ecco una soluzione sporca che richiede la webenginepage esistente> view(). Questo è per gli eventi del mouse, e non sarebbe una grande sorpresa se non è posizionato per gli eventi di tastiera:

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

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

Problemi correlati