2

最近QtWebkitで遊んでいますが、MouseEventなどのイベントを担当するQWebViewに表示される要素を解決できるかどうか疑問に思っていました。

次のような関数を使用して、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 に答える