Название: [РЕШЕНО]Перехват нажатия на ссылку в 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).
|