QtWebkit разрешает диспетчер событий - PullRequest
2 голосов
/ 15 марта 2011

В последнее время я играю с QtWebkit, и мне было интересно, возможно ли разрешить элемент, отображаемый в QWebView, который отвечает за событие, например, MouseEvent.

Я установил функцию EventFilter в объекте WebView с такой функцией:

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

Есть ли способ получить ссылку на элемент, по которому щелкнули, который отображается в QWebView? Насколько я могу судить, переданный QObject равен объекту WebView, и событие, похоже, не содержит ссылку на его диспетчер.

Так как я далеко от того, чтобы быть профессионалом в C ++, я искренне надеюсь, что что-то упустил, и вы, ребята, можете мне помочь:)

Заранее спасибо Timo

Ответы [ 2 ]

5 голосов
/ 16 марта 2011

Я верю, что вы могли бы сделать:

  1. приведение параметра объекта к QWebView
  2. получить QWebFrame под мышью через vebView-> page () -> frameAt () метод
  3. используйте hitTestContent метод возвращаемого кадра для определения элемента для данной позиции мыши

Ниже приведен пример:

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

надеюсь, это поможет, с уважением

1 голос
/ 06 августа 2011

Используйте qobject_cast вместо dynamic_cast.

...