我重新创建了一个webkit示例,该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函数它仍然崩溃。为什么会崩溃?我该如何解决这个问题?
答案 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()
需要运行多次。不过,它暂时会起作用。