2

我最近在玩QtWebkit,我想知道是否可以解决QWebView 中显示的负责事件的元素,例如MouseEvent。

我在 WebView 对象上安装了一个 EventFilter 函数,其函数如下:

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++ 专业人士还很远,我真诚地希望我错过了一些东西,你们可以帮助我:)

提前感谢蒂莫

4

2 回答 2

5

我相信你可以做的是:

  1. 将对象参数转换为 QWebView
  2. 通过vebView->page()->frameAt()方法获取鼠标下的 QWebFrame
  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;
}

希望这会有所帮助,问候

于 2011-03-16T03:00:08.680 回答
1

使用qobject_cast而不是dynamic_cast.

于 2011-08-06T15:19:50.420 回答