【问题标题】:reimplement the shouldInterruptJavaScript() in Qt (C++)在 Qt (C++) 中重新实现 shouldInterruptJavaScript()
【发布时间】:2012-03-06 06:30:14
【问题描述】:

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

当JavaScript程序长时间运行时调用该函数。

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

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

警告:由于二进制兼容性限制,此函数不是虚拟的。如果您想在 QWebPage 子类中提供您自己的实现,请改为在您的子类中重新实现 shouldInterruptJavaScript() 槽。 QtWebKit 会动态检测槽并调用它。


我不希望 qt 在 javascript 长时间运行时显示消息。
那么,我该如何重新实现 ShoudInteruptJavaScript?
我应该在哪里创建它?
请给我一个样品 谢谢

【问题讨论】:

    标签: c++ qt webkit


    【解决方案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 调用。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        新建一个继承自 QWebPage 的自定义类,确保它是一个 Q_OBJECT 来接收信号。

        类 MyFunkyPage:公共 QWebPage { Q_OBJECT 公共插槽: 布尔应该中断JavaScript(){ QApplication::processEvents(QEventLoop::AllEvents, 42); // 忽略错误 返回假; } };

        将 QWebView 的页面设置为 QWebPage 的自定义子类。

        setPage(new MyFunkyPage());

        然后当您的页面收到此信号时,它不会停止脚本执行,也不会显示对话框。

        【讨论】:

        • 为什么要添加 processEvents 调用?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多