Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vitto74 от Май 06, 2010, 07:37



Название: [РЕШЕНО]Перехват нажатия на ссылку в QWebView
Отправлено: Vitto74 от Май 06, 2010, 07:37
Доброго времени суток. Возникла потребность создать полностью свой обработчик нажатия на ссылку - при нажатии должен вызываться только он и ничего кроме этого не должно происходить.
Если это уже обсуждалось или знаете где можно почитать на эту тему - дайте ссылку.


Название: Re: Перехват нажатия на ссылку в QWebView
Отправлено: sendevent от Май 06, 2010, 12:51
можно во вью ловить нажатия мши, проверять через QWebHitTestResult (http://doc.trolltech.com/4.6/qwebhittestresult.html) - линк ли, и соответственно обрабатывать. можно в QWebPage::acceptNavigationRequest (http://doc.trolltech.com/4.6/qwebpage.html#acceptNavigationRequest) ловить QWebPage::NavigationTypeLinkClicked.
видимо, почитать стоит все из QtWebKit Module (http://doc.trolltech.com/4.6/qtwebkit.html).


Название: Re: Перехват нажатия на ссылку в QWebView
Отправлено: Vitto74 от Май 06, 2010, 14:57
Спасибо. Перечитал вот эту тему (http://www.prog.org.ru/topic_12794_0.html) и сделал вот такой класс
Код:
#ifndef QMYWEBPAGE_H
#define QMYWEBPAGE_H

#include <QWebPage>
#include <QWebFrame>
#include <QPointer>
#include <QMessageBox>
#include <QNetworkRequest>
#include <QDebug>

class myWebPage : public QWebPage
{
    Q_OBJECT
public:
    myWebPage(QObject* parent = 0) : QWebPage(parent) {};

    struct Navigation {
QPointer<QWebFrame> frame;
QNetworkRequest request;
NavigationType type;
    };

    virtual bool acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest &request, NavigationType type){
Navigation n;
n.frame = frame;
n.request = request;
n.type = type;
navigations.append(n);
if (type == QWebPage::NavigationTypeOther){
//Сделано для того, чтобы QWebView реагировал на метод setUrl.
return true;
} else {
emit this->urlClick(request.url(), type);
return false;
}
    }

    virtual QWebPage* createWindow(WebWindowType){
QWebPage* page = new myWebPage(this);
createdWindows.append(page);
return page;
    }

signals:
    void urlClick(QUrl, QWebPage::NavigationType);

private:

    //Я не знаю зачем они там хранятся, но подозреваю, что для
    //предотвращения утечек памяти
    QList<Navigation> navigations;
    QList<QWebPage*> createdWindows;
};

#endif // QMYWEBPAGE_H
Теперь при клике по ссылке или кнопке генерится сигнал urlClick(QUrl, NavigationType). Использую я это таким образом
Код:
    delete(ui->webView->page());
    myWebPage *page = new myWebPage();
    ui->webView->setPage(page);
    connect(page, SIGNAL(urlClick(QUrl, QWebPage::NavigationType)), this, SLOT(url(QUrl, QWebPage::NavigationType)));
Таким образом я могу полностью контролировать поведение QWebView в слоте url(QUrl, QWebPage::NavigationType).