2 Stimmen

QtWebkit auflösender Ereignis-Dispatcher

Ich spiele in letzter Zeit mit QtWebkit herum und frage mich, ob es möglich ist, das im QWebView angezeigte Element aufzulösen, das für ein Ereignis, z. B. ein MouseEvent, verantwortlich ist.

Ich habe eine EventFilter-Funktion am WebView-Objekt mit einer Funktion wie dieser installiert:

bool WebKitManager::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::MouseButtonRelease)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        if(mouseEvent->button() == Qt::LeftButton)
        {
            // what now?!
        }

    }
    return false;
}

Gibt es eine Möglichkeit, einen Verweis auf das angeklickte Element zu erhalten, die in der QWebView angezeigt wird? Soweit ich sagen kann, entspricht das übergebene QObject das WebView-Objekt und das Ereignis scheint nicht zu halten Referenz zu seinem Dispatcher.

Da ich weit davon entfernt bin, ein C++-Profi zu sein, hoffe ich aufrichtig, dass ich etwas verpasst habe und ihr mir helfen könnt :)

Vielen Dank im Voraus Timo

5voto

serge_gubenko Punkte 19568

Ich glaube, was Sie tun könnten, ist:

  1. Objektparameter in QWebView umwandeln
  2. QWebFrame unter der Maus erhalten über vebView->page()->frameAt() 方法
  3. verwenden. hitTestInhalt Methode des zurückgegebenen Rahmens, um das Element für die angegebene Mausposition zu erkennen

Nachstehend finden Sie ein Beispiel:

bool WebKitManager::eventFilter(QObject *object, QEvent *event)
{
    if (event->type() == QEvent::MouseButtonRelease)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        if (mouseEvent->button() == Qt::LeftButton)
        {
            QWebView *view = dynamic_cast<QWebView*>(object);

            QPoint pos = view->mapFromGlobal(mouseEvent->globalPos());
            qDebug() << view->url().toString() << " clicked at x:" << pos.x() << " y:" << pos.y();

            QWebFrame *frame = view->page()->frameAt(mouseEvent->pos());
            if (frame!=NULL)
            {
                QWebHitTestResult hitTestResult = frame->hitTestContent(pos);
                qDebug() << "element" << hitTestResult.element().localName();
            }
        }
    }
    return false;
}

Ich hoffe, das hilft Ihnen, viele Grüße

1voto

peter Punkte 11

Verwenden Sie qobject_cast anstelle von dynamic_cast .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X