2012-02-14 35 views
1

據的Qt的幫助下QWebPage [插槽ShoudInteruptJavaScript],位於here:重新實現Qt中的shouldInterruptJavaScript()(C++)

該功能被稱爲一個JavaScript程序運行很長一段時間時的時間。

如果用戶想停止JavaScript,則實現應該返回true;否則爲false。

默認實現使用QMessageBox ::信息與QMessageBox :: Yes和QMessageBox :: No按鈕執行查詢。

警告:由於二進制兼容性限制,此功能不是虛擬的。如果您想在QWebPage子類中提供您自己的實現,請改爲在您的子類中重新實現shouldInterruptJavaScript()插槽。 QtWebKit將動態檢測插槽並調用它。


我不希望qt顯示JavaScript runnig很長一段時間的消息。
那麼,我該如何重新實現ShoudInteruptJavaScript?
我應該在哪裏創建它?
請出示樣品 感謝

回答

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

爲什麼添加processEvents調用? – Danish94 2012-09-18 00:06:56

0

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

@安森-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調用。