使用on_textEdit_textChanged()通过WebKit Previewer示例崩溃程序

时间:2012-06-16 17:32:28

标签: qt webkit qtwebkit

我重新创建了一个webkit示例,该webkit显示包含HTML的textEdit的内容:http://qt-project.org/doc/qt-4.8/webkit-previewer.html

我更改了它,而不是单击按钮时更改了webkit HTML,它在t​​extEdit中的文本被更改后发生了变化:

// 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 个答案:

答案 0 :(得分:1)

您的程序正在进入无限循环,因为在示例中,webView的loadFinished(bool)信号与text / html编辑器的updateTextEdit()插槽之间存在连接。

基本上,编辑HTML会导致页面再次加载,导致编辑器更新,导致页面再次加载,依此类推。

我解决这个问题的一个简单方法是向updateTextEdit SLOT /函数添加一个静态bool标志,只允许它运行一次。

 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()需要运行多次。不过,它暂时会起作用。