2

QPlainTextEdit に、すべての行が 10 個のスペースで始まるテキストがあります。

          line1
          line2
          line3
          line4

次に、いくつかの行を選択し、ループで選択したすべての行から最初の 2 つのスペースを削除します。

cursor.beginEditBlock();
for (QTextBlock block = startBlock; block != endBlock; block = block.next()) {
    cursor.setPosition(block.position());
    cursor.setPosition(block.position() + 2, QTextCursor::KeepAnchor);
    cursor.removeSelectedText();
}
cursor.endEditBlock();

問題は、上記のコードが最後に選択された行を「損傷」することです-まるである種の行末マーカーを削除したかのように-最後の行の終わりにジャンプしたいとき、カーソルはその下の行に移動します。 1番目と2番目のキャラクター。編集後、選択範囲でさえ正しく表示されません。最後の行を除くすべての行で選択インジケーターがウィンドウの右端まで拡張され、最後の行のインジケーターは行と同じ幅しかありません。

        line1    < 1. selected lines, run the code
        line2    <
        line3    <        < 2. here I jump to end of line
 |      line4

 ^ 3. cursor appears here

削除するbeginEditBlock()と、endEditBlock()すべて正常に動作します。

なぜこれが起こっているのか誰か知っていますか?

4

1 に答える 1

1

この状態block != endBlockでは、カーソルが最後のブロックに到達することはありません。これを使用する必要があります:

QTextBlock block = document->firstBlock();
while (block.isValid())
{
    // do your stuff
    block = block.next();
}
于 2013-03-04T07:07:26.197 に答える