1. 程式人生 > >QT4.8.4 QWebView中點選連結的處理

QT4.8.4 QWebView中點選連結的處理

一般在Dialog中使用QWebView會直接拖一個QWebView元件、 但是不能點選連結,然後會採用


connect(ui->webView,SIGNAL(linkClicked(QUrl)),this,SLOT(openUrl(QUrl)));
void web::openUrl(QUrl url){
  ui->webView->load(url);
}

來處理網頁中載入的連結、但是這樣不可以不能確定那個連線是在新視窗中開啟、那個是在原來的視窗中開啟。

 

如果是新彈出視窗的話、會響應createWindow(); 可以參考。

 

在QWebPage中有這麼一個函式、重寫 acceptNavigationRequest ( QWebFrame * frame, const QNetworkRequest & request, NavigationType type )函式

 

程式碼如下:

 webPage.h

#ifndef WEBPAGE_H
#define WEBPAGE_H
#include <QWebPage>
#include <QNetworkRequest>
 class webPage : public QWebPage
{
    Q_OBJECT
public:
    explicit webPage(QObject *parent = 0);
signals:
    void loadLink(const QUrl & url);
    void openLink(const QUrl & url);
 
 protected:
    bool acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type);//重寫
 };
 
#endif // WEBPAGE_H

webPage.cpp

#include "webPage.h"
 webPage::webPage(QObject *parent) :
    QWebPage(parent)
{
}
bool webPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type)
{
    if(type==0)
    {//如果是使用者點選
        if(frame!=mainFrame())
        { //如果不是在本視窗的連線
            emit openLink(request.url());//傳送開啟新連線訊號
        }
        else
        {
            emit loadLink(request.url());//傳送點選連線訊號
        }
    }
    return QWebPage::acceptNavigationRequest(frame, request, type);
}

然後在你使用QWebView的地方設定QWebView的page就可以了

{
webPage*  page=new webPage(this);
w=new QWebView(this);
w->setPage(page); w->load(QUrl("HTTP://WWW.BAIDU.COM"));
connect(page,SIGNAL(loadLink(QUrl)),this,SLOT(linkUrl(QUrl)));
connect(page,SIGNAL(openLink(QUrl)),this,SLOT(openUrl(QUrl))); 
}

 
void web::linkUrl(QUrl url){
//處理不開啟新視窗的連線 
}
void web::openUrl(QUrl url){
//處理新視窗的連線
}