Russian Qt Forum
Ноябрь 27, 2024, 19:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Перехват нажатия на ссылку в QWebView  (Прочитано 4836 раз)
Vitto74
Гость
« : Май 06, 2010, 07:37 »

Доброго времени суток. Возникла потребность создать полностью свой обработчик нажатия на ссылку - при нажатии должен вызываться только он и ничего кроме этого не должно происходить.
Если это уже обсуждалось или знаете где можно почитать на эту тему - дайте ссылку.
« Последнее редактирование: Май 06, 2010, 14:58 от Vitto74 » Записан
sendevent
Гость
« Ответ #1 : Май 06, 2010, 12:51 »

можно во вью ловить нажатия мши, проверять через QWebHitTestResult - линк ли, и соответственно обрабатывать. можно в QWebPage::acceptNavigationRequest ловить QWebPage::NavigationTypeLinkClicked.
видимо, почитать стоит все из QtWebKit Module.
Записан
Vitto74
Гость
« Ответ #2 : Май 06, 2010, 14:57 »

Спасибо. Перечитал вот эту тему и сделал вот такой класс
Код:
#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).
« Последнее редактирование: Май 10, 2010, 09:25 от Vitto74 » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.