2012-06-16 32 views
1

程序崩潰我重新創建,顯示包含HTML文本編輯的內容的的webkit的例子:http://qt-project.org/doc/qt-4.8/webkit-previewer.html與on_textEdit_textChanged(WebKit的預覽器的例子)

我改變它,以便而非webkit的HTML在點擊該按鈕被改變,它改變了正文中的文本正在更改:

// changed when button is click. Works fine. 
void Previewer::on_previewButton_clicked() 
{ 
    // Update the contents in web viewer 
    QString text = htmlTextEdit->toPlainText(); 
    webView->setHtml(text); 
} 

// change when text is changed. Crashes. 
void Previewer::on_htmlTextEdit_textChanged() 
{ 
    // Update the contents in web viewer 
    QString text = "<html><body><h1>No crash!</h1></body></html>"; 
    webView->setHtml(text); 
} 

這會導致程序在啓動時立即崩潰。我修改了程序,稍後才運行函數(我想也許是需要初始化的東西),但一旦它到達textChanged函數,它仍然崩潰。它爲什麼會崩潰?我怎樣才能解決這個問題?

回答

1

您的程序正在進入無限循環,因爲在此示例中,webView的loadFinished(bool)信號與文本/ html編輯器的updateTextEdit()插槽之間存在連接。

基本上,編輯HTML會導致頁面再次加載,這會導致編輯器更新,從而導致頁面再次加載,等等。

我解決了這個問題的一個快速方法是在updateTextEdit SLOT /函數中添加一個靜態布爾標誌,只允許它運行一次。

void MainWindow::updateTextEdit() 
{ 
    static bool once = false; 

    if (once) { 
     return; 
    } 

    once = true; 

    QWebFrame *mainFrame = centralWidget->webView->page()->mainFrame(); 
    QString frameText = mainFrame->toHtml(); 
    centralWidget->plainTextEdit->setPlainText(frameText); 
} 

這樣做對我有用,但是您的版本可能與我的工作方式不同。我跟着例如緊密,但增加了一個htmlchanged()插槽預覽類,搞得像這樣的連接:

connect(centralWidget->plainTextEdit, SIGNAL(textChanged()), centralWidget, SLOT(html_changed())); 

而且,我不是專家,但我敢肯定這是不是最好的方法爲了解決這個問題,我假設updateTextEdit()需要運行多次。儘管如此,它仍然可以工作。