根据Qt对QWebPage [Slot ShoudInteruptJavaScript ]的帮助,位于here:
当JavaScript程序长时间运行时,将调用此函数。
如果用户想要停止JavaScript,则实现应该返回true;否则是假的。
默认实现使用带有QMessageBox :: Yes和QMessageBox :: No按钮的QMessageBox :: information执行查询。
警告:由于二进制兼容性约束,此功能不是虚拟的。如果要在QWebPage子类中提供自己的实现,请重新实现子类中的shouldInterruptJavaScript()槽。 QtWebKit将动态检测插槽并调用它。
我不希望qt在javascript runnig很长一段时间内显示一条消息
那么,我如何重新实现ShoudInteruptJavaScript呢?
我应该在哪里创建它?
请给我看一个样品
感谢
答案 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调用。