2

これが初心者の質問である場合は申し訳ありません。エディターでエラーをマークするためのコードがいくつかありますが、エラーがなくなったときにマークをクリアする方法が見つかりません。エラーをレンダリングするために呼び出しているメソッドは次のとおりです。

void Editor::highlightErrors( Thing* t )
{
    if ( !t )
        return; 

    const std::vector<Thing::Error>& errors = t->errors();

    QTextCursor tc = textCursor();
    tc.select(QTextCursor::Document);

    QList<QTextEdit::ExtraSelection> extraSelections;
    for(int i = 0; i < errors.size(); ++i) {
        const Thing::Error& error = errors[i];
        QTextEdit::ExtraSelection sel;
        sel.format = this->errorFormat();
        sel.format.setToolTip(QString(error.error.c_str()));
        sel.cursor = tc;
        sel.cursor.clearSelection();
        sel.cursor.setPosition(error.startPos);
        sel.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, error.endPos - error.startPos);
        sel.cursor.mergeCharFormat(sel.format);
        extraSelections.append(sel);
    }
    setExtraSelections(extraSelections);
}

このメソッドがエラーなしで呼び出された場合、QPlainTextEdit がエラー形式なしでテキストを再描画することを期待しますが、そうではありません。QTextLayout::draw が適切に呼び出され、余分な選択もクリアされますが、テキストはまだエラー形式で描画されています。

助けてくれてありがとう。

4

1 に答える 1

2

私にはQtのバグのように思えます。

修正/回避策を探しているだけの場合:

これを後に追加しますtc.select(QTextCursor::Document);

  tc.setCharFormat(textCursor().charFormat());

これで問題は解決するはずです。

詳細

これは私がこれをテストしていた機能です。関数に int num を取り、それらの char 位置extraSelectionをカスタム形式でフォーマットするようにしました (上記の修正は含まれません)。

void MainWindow::highlightErrors(int num) {
  QTextCursor tc = ui_.textEdit->textCursor();
  tc.select(QTextCursor::Document);
  QTextCharFormat format;
  QColor lineColor = QColor(Qt::red);
  format.setBackground(lineColor);
  // format.setFontCapitalization(QFont::AllLowercase);
  QList<QTextEdit::ExtraSelection> extraSelections;
  for(int i = 0; i < num; ++i) {
    QTextEdit::ExtraSelection selection;
    selection.format = format;
    selection.format.setToolTip(QString::number(i));
    selection.cursor = tc;
    selection.cursor.clearSelection();
    selection.cursor.setPosition(i);
    selection.cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, 1);
    // selection.cursor.mergeCharFormat(selection.format);
    extraSelections.append(selection);
  }
  ui_.textEdit->setExtraSelections(extraSelections);
}

上記のコードでは、2 行がコメント化されています。赤い背景が適用されるだけです。これで問題なく動作します。

ただし、コメントを外しformat.setFontCapitalization(QFont::AllLowercase);て再実行すると、バックグラウンドの動作は期待どおりですが、小文字の変更は適用されません (最初に大文字であることを確認してください) (フォーマットの変更のみが適用されるため、これは Qt のバグだと思います)一部)

ここで もコメント解除selection.cursor.mergeCharFormat(selection.format);すると、小文字の形式も適用されていることがわかりますが、形式の削除は機能しなくなります。

したがって、が変更されCharFormat()たときにドキュメント全体をリセットする修正が必要です。errorSelection()

于 2013-04-22T14:14:53.150 に答える