Обработка ошибок в QWebView/QWebPage

Я хочу получить больше информации, чем просто success = false в loadFinished (чаще всего это просто отмененная загрузка). Из документации и других сообщений на этом сайте я понял, что мне следует создать подкласс QWebPage и переопределить метод extension() для обработки ErrorPageExtension.

Однако я не заставляю его работать, т. Е. Независимо от того, что я пытаюсь, мой метод расширения не вызывается. Я, наверное, делаю что-то очень глупое, но не вижу этого. В основном мой класс выглядит так:

class MyWebPage : public QWebPage
{
  Q_OBJECT

public:

  MyWebPage(QObject* parent = 0) : QWebPage(parent) {}  

  virtual bool extension(Extension extension,
                         const ExtensionOption* option = 0, 
                         ExtensionReturn* output = 0)
  {
    // blah
  }

  virtual bool supportsExtension(Extension extension)
  {
    // blah
  }  
};

Реализация методов не проблема, у меня есть точка останова, и она никогда не вызывается. Я создаю экземпляр, например

MyWebPage* page = new MyWebPage(this);

mUi.WebView->setPage(page);

Я немного не уверен насчет времени жизни объекта QWebPage в QWebView, но из моих тестов кажется, что QWebPage всегда остается одним и тем же экземпляром и просто загружает новый контент. Поэтому я предположил, что должен просто передать свою страницу QWebView, я не видел другого способа заставить его использовать мой производный класс. Но при загрузке поддельных URL-адресов, несуществующих локальных файлов или неподдерживаемого контента либо через WebView, либо напрямую через мейнфрейм страницы я никогда не получаю вызов с информацией ErrorPageExtension.

Любая помощь приветствуется. Это использует Qt 4.8.2.


person Christian    schedule 25.01.2013    source источник


Ответы (1)


Есть небольшая ошибка:

...
virtual bool supportsExtension(Extension extension) const // const!!!
{
    return QWebPage::ErrorPageExtension === extension;
}
...

Вы забыли скопировать модификатор const.

person york.beta    schedule 25.01.2013
comment
Argh ... это было так, спасибо за указатель! Я думаю, что мог бы смотреть на это еще много часов, не видя этого;) - person Christian; 28.01.2013
comment
Да, именно поэтому в С# есть ключевое слово override :) - person york.beta; 28.01.2013