在Qt(C ++)中重新实现shouldInterruptJavaScript()

时间:2012-02-14 21:36:05

标签: c++ qt webkit

根据Qt对QWebPage [Slot ShoudInteruptJavaScript ]的帮助,位于here:

  

当JavaScript程序长时间运行时,将调用此函数。

     

如果用户想要停止JavaScript,则实现应该返回true;否则是假的。

     

默认实现使用带有QMessageBox :: Yes和QMessageBox :: No按钮的QMessageBox :: information执行查询。

     警告:由于二进制兼容性约束,此功能不是虚拟的。如果要在QWebPage子类中提供自己的实现,请重新实现子类中的shouldInterruptJavaScript()槽。 QtWebKit将动态检测插槽并调用它。


我不希望qt在javascript runnig很长一段时间内显示一条消息 那么,我如何重新实现ShoudInteruptJavaScript呢?
我应该在哪里创建它? 请给我看一个样品 感谢

3 个答案:

答案 0 :(得分:2)

您需要的所有信息都在文档中。

创建一个继承自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 :(得分:1)

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));
}

答案 2 :(得分:1)

@ 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调用。