переопределить mustInterruptJavaScript () в Qt (C ++) - PullRequest
1 голос
/ 15 февраля 2012

Согласно справке Qt для QWebPage [Slot ShoudInteruptJavaScript ], расположенной здесь :

Эта функция вызывается, когда работает программа JavaScriptв течение длительного периода времени.

Если пользователь хочет остановить JavaScript, реализация должна вернуть true;в противном случае false.

Реализация по умолчанию выполняет запрос, используя QMessageBox :: information с кнопками QMessageBox :: Yes и QMessageBox :: No. Предупреждение. Из-за ограничений двоичной совместимости эта функция не является виртуальной.Если вы хотите предоставить свою собственную реализацию в подклассе QWebPage, переопределите слот shouldInterruptJavaScript () в своем подклассе.QtWebKit будет динамически определять слот и вызывать его.

Я не хочу, чтобы qt показывало сообщение при запуске javascript в течение длительного периода времени.Итак, как я могу переопределить ShoudInteruptJavaScript?и где я должен создать это?Пожалуйста, покажите мне образец Спасибо

Ответы [ 3 ]

2 голосов
/ 16 февраля 2012

Вся необходимая информация содержится в документации.

Создайте новый пользовательский класс, который наследуется от QWebPage, убедитесь, что это Q_OBJECT для приема сигналов.

class MyFunkyPage : public QWebPage {
    Q_OBJECT
public slots:
    bool shouldInterruptJavaScript() {
        QApplication::processEvents(QEventLoop::AllEvents, 42);
        // Ignore the error
        return false;
    }
};

Установите страницувашего QWebView в пользовательский подкласс QWebPage.

setPage(new MyFunkyPage());

Тогда, когда ваша страница получит этот сигнал, она не остановит выполнение скрипта и не покажет диалоговое окно.

1 голос
/ 27 мая 2016

@ anson-mackeracher почти все правильно понял.

Qt нужно, чтобы это был частный слот, а не публичный.Вот что работает для моего класса:

class MyFunkyPage : public QWebPage {
  Q_OBJECT

private slots:
  bool shouldInterruptJavaScript() {
    // Ignore the error  (return true to kill the runaway JavaScript)
    return false;
  }
};

Установите страницу вашего QWebView для пользовательского подкласса QWebPage.

setPage(new MyFunkyPage());

Я только что протестировал это с Qt 4.8.4, и он работаетКак колдовство.Мне не нужен вызов processEvents.

1 голос
/ 10 декабря 2013

Решение MyFunkyPage может привести к утечке памяти и вызвать сбои, поскольку объект, переданный в setPage, не имеет родителя, а setPage не становится владельцем.Вместо этого

class QWebPageWithoutJsWarning : public QWebPage {
    Q_OBJECT
public:
    QWebPageWithoutJsWarning(QObject* parent = 0) : QWebPage(parent) {}
public slots:
    bool shouldInterruptJavaScript() {
        return false;
    }
};

Установите страницу вашего QWebView для пользовательского подкласса QWebPage, родившегося в WebView,

void suppressJSWarning(QWebView& webView) {
    webView.setPage(new QWebPageWithoutJsWarning(&webView));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...