1

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

我对其进行了更改,而不是在单击按钮时更改 webkit HTML,而是在更改 textEdit 中的文本时更改了它:

// 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 函数,它仍然崩溃。为什么会崩溃?我怎样才能解决这个问题?

4

1 回答 1

1

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

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

我解决这个问题的一个快速方法是向updateTextEditSLOT/函数添加一个静态布尔标志,只允许它运行一次。

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

于 2012-08-06T00:48:58.097 回答