1

HTMLを含むtextEditのコンテンツを表示するWebkitの例を再作成しました:http://qt-project.org/doc/qt-4.8/webkit-previewer.html

ボタンをクリックしたときにWebkitHTMLが変更されるのではなく、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 /関数に追加して、1回だけ実行できるようにすることでした。

 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 に答える