Спасибо. Перечитал вот 
эту тему и сделал вот такой класс
#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).